Class.forName(String)! Urgente!

11 respostas
thiagorani

E ae pessoal beleza?

Estou tentando instanciar uma classe apartir de uma string.

Class Classe;
Classe = Class.forName(Campo.getCls());

Esse metodo Campo.getCls() me retorna uma String com o nome da classe a ser instanciada. Ex: clsXXXX
A partir dai eu gostaria de enxergar os metodos da classe instanciada, mas nao consigo, me parace que busca os metodos na classes Class!
Alguém já fez algo parecido?

[]´s

11 Respostas

D

Olha, suponha o seguinte cenário:

Você tem um arquivo JAR (devidamente apontado em CLASSPATH) que contém a seguinte entrada: br/com/seusite/utils/MinhaClasse.class.

Se você fizer

try {
   Class.forName("br.com.seusite.utils.MinhaClasse");
   MinhaClasse mc = new MinhaClasse();
       // ... outras instrucoes ...
}
catch (ClassNotFoundException e) {
      e.printStackTrace();
}

Vai funcionar com certeza!

claudio

Bao, por aqui funciona tenta esse codigo aqui:

import java.lang.reflect.*;

public class Reflect{

	public static void main(String[] args){
		try{

			Class classe; 
			classe = Class.forName("java.lang.String"); 

			Method[] metodos = classe.getMethods();
		
			for(int i=0; i<metodos.length; i++){
				System.out.println(metodos[i]);
			}

		}catch(Exception e){
			e.printStackTrace();
		}
	}

}

Agora soh um toque, acho que vc fez essa classe correndo soh para teste, mas o comentario abaixo vale para quem ler o forum ;) :

Procure sempre utilizar a convencao java. No seu codigo vc usou nome de varivel com letra maiuscula, da ideia de uma classe com metodo estatico:
Class Classe; ou Campo.getCls
e nao tenha dó de escrever, por exemplo uma vez peguei um sistema antigo uma tabela com nome de CONS_CAU_COB (o que quer dizer isso? ;) ), logo use por exemplo:
campo.getClasse()
ou melhor como vc esta devolvendo apenas o nome da classe defina seu metodo assim:
public String getClassName(){...}

Abraco,

thiagorani

Claudio,

Valeu pela dica.
Vou usar o exemplo que voce passo.

[]´s

thiagorani

Claudio usei assim :

try{ 

     Class classe; 
     classe = Class.forName(Campo.getCls()); 
     Method[] metodos = classe.getMethods(); 
       
       for(int z=0; z<metodos.length; z++){ 
            	System.out.println(metodos[z]); 
         } 

     }catch(Exception e){ e.printStackTrace();}

Mas deu erro nesse atributo Method[] cannot be resolved or is not a type

Ops … deu certo

import java.lang.reflect.*;

[]´s

claudio

:smiley:



thiagorani

claudio ta dando esse erro :

java.lang.ClassNotFoundException: clsAmbiente

at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1307)

at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1156)

at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:198)

at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:132)

at java.lang.Class.forName1(Native Method)

at java.lang.Class.forName(Class.java:134)

at org.apache.jsp.jspCadAcesso$jsp._jspService(jspCadAcesso$jsp.java:465)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)

at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)

at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:431)

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:355)

at scp.srvl.srvlAcesso.redireciona(srvlAcesso.java:173)

at scp.srvl.srvlAcesso.doGet(srvlAcesso.java:154)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:446)

at org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:180)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)

at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)

at java.lang.Thread.run(Thread.java:498)
claudio

Cara o problema eh classpath.

Sua classe esta em?
WEB-INF/classes

ou dentro de um jar em?
WEB-INF/lib

Para te ajudar melhor abre o icq: 20166109 [meu uin]

Abraco,

thiagorani

Bom dia claudio.

Nao tem como eu usar o icq aqui. Mas os class estão na pasta WEB-INF/classes sim.
Oq pode ser?

[]´s

jack_ganzha

Vc colocou o nome da sua classe como clsAmbiente. Esse é o nome completo da classe? Ela não está em um pacote? Para usar o Class.forName vc deve indicar o nome completo da classe. Como java.lang.String ao inves de apenas String.

valeuz…


jack_-_ganzha

thiagorani

ela esta em pacotes sim

scp.cls.clsAmbiente

tenho que passar uma string assim “scp.cls.clsAmbiente”?

[]´s

thiagorani

claudio,

consegui ver os metdos, mas tem como eu usa-los?
por exemplo, toda classe tem um metodo x.
dentro de um loop [lendo um resultset], pego o nome da classe, acesso os metodos pelo reflect, e uso o metodo x e vai para o proximo registro!
Tem como fazer isso?

[]´s

Criado 9 de abril de 2003
Ultima resposta 10 de abr. de 2003
Respostas 11
Participantes 4