Class.forname não acha nenhuma classe (RESOLVIDO)

12 respostas
DAREK6920

Alguem poderia me dizer quais os motivos pelos quais o metodo class.forname não retornaria as classes ?
Ja estou pronto para desistir do negocio e fazer uma enorme arvore de ifs.

Agradeço qualquer ajuda

12 Respostas

regis_hideki

Está colocando o caminho completo?

DAREK6920

Já tentei de todo jeito possivel, inclusive alternando entre pontos e barras, letra do drive e nada

DAREK6920

o caminho seria TA01/src/ta01/TNFE/IDE de acordo com a arvore de arquivos do classpath

DAREK6920

existe algum formato especifico para este caminho ?

regis_hideki

A separação é por ponto à partir do src.

DAREK6920

continua o problema,

public static void alocar(String metodo, String valor) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
    try {
            TNFE.IDE X = new TNFE.IDE();
            
            Object c = Class.forName("TA01/scr.ta01.TNFE.IDE");
            Field f = c.getClass().getDeclaredField(metodo);
            f.setAccessible(true);
            try {
                f.set(c,valor);
            } catch (IllegalArgumentException ex) {
                Logger.getLogger(jd.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(jd.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        } catch (NoSuchFieldException ex) {
            Logger.getLogger(jd.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(jd.class.getName()).log(Level.SEVERE, null, ex);
        }
}

problema :
public static void alocar(String metodo, String valor) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
try {
TNFE.IDE X = new TNFE.IDE();

Object c = Class.forName("TA01/scr.ta01.TNFE.IDE");
Field f = c.getClass().getDeclaredField(metodo);
f.setAccessible(true);
try {
f.set(c,valor);
} catch (IllegalArgumentException ex) {
Logger.getLogger(jd.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(jd.class.getName()).log(Level.SEVERE, null, ex);
}

} catch (NoSuchFieldException ex) {
Logger.getLogger(jd.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(jd.class.getName()).log(Level.SEVERE, null, ex);
}
}

regis_hideki

Não entendi direito se o nome do projeto é o “TA01” em maiúsculo, ou o que está em minúsculo(ta01).

Se for o maiúsculo, tenta fazer isso:

Class.forName("ta01.TNFE.IDE");

Se for o minúsculo, tenta isso:

rogelgarcia

O Class.forName recebe o caminho completo da classe.

Exemplo:

Se sua classe é

package x.y.z;

public class Clazz {
}

O seu código deveria ser:

Class.forName("x.y.z.Clazz");

A classe que você quer carregar tem que estar no classpath da aplicação.

DAREK6920
Fazendo da segunda forma  uma pequena alteração no log de erros :

28/02/2012 21:55:02 ta01.jd jButton2ActionPerformed

GRAVE: null

java.lang.ClassNotFoundException: TNFE.IDE

at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

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

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

at ta01.funcoes.alocar(funcoes.java:855)

at ta01.ts.readConfig(ts.java:97)

at ta01.ts.main(ts.java:123)

at ta01.jd.jButton2ActionPerformed(jd.java:203)

at ta01.jd.access$100(jd.java:36)

at ta01.jd$2.actionPerformed(jd.java:114)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:6288)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)

at java.awt.Component.processEvent(Component.java:6053)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4651)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4481)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)

at java.awt.Container.dispatchEventImpl(Container.java:2085)

at java.awt.Window.dispatchEventImpl(Window.java:2478)

at java.awt.Component.dispatchEvent(Component.java:4481)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)

at java.awt.EventQueue.access$000(EventQueue.java:84)

at java.awt.EventQueue$1.run(EventQueue.java:602)

at java.awt.EventQueue$1.run(EventQueue.java:600)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)

at java.awt.EventQueue$2.run(EventQueue.java:616)

at java.awt.EventQueue$2.run(EventQueue.java:614)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122).

E da primeira o erro continua. Para esclarecer, o nome do projeto pe TA01, dentro dele há uma pasta scr e dentro dela uma pasta ta01, minusculo. dentro desta pasta estão os arquivos inclusive todas as classes do projeto.
Não sei se mencionei, mas se eu escolher qualquer uma das classes do projeto o resultado vai ser o mesmo, o metodo simplesmente me diz que não existe a classe.

DAREK6920

Finalmente cheguei a algum lugar. Alterei a string de chamada e o metodo passou a reconhecer a classe ta01.TNFE.
Curiosamente, ou talvez eu mesmo tenha entendido errado, o class.forname não lista as subclasses de ta01.TNFE.
Explicando, no meu caso eu tenho uma classe chamada TNFE e dentro desta classe, outra classe chamada ide. O class.forname não reconhece a segunda classe.
Estou fazendo algo errado ou é assim mesmo ?

rogelgarcia

Se sua classe é:

package x.y.z;

public class Clazz {

	class Sub1 {
		
	}
	
}

Para carregar a classe interna é:

Class.forName("x.y.z.Clazz$Sub1");

Esqueça a estrutura do seu projeto. A JVM só exerga o que está no classpath. Se as classes que você quer carregar estiverem no classpath você carrega da forma que mencionei. Caminho completo: pacote + classe.

Se der ClassNotFoundException a classe pedida não está no classpath.

DAREK6920

Realmente você tem razão, o segredo esta em incluir o nome do pacote na frente da classe. Não estava conseguindo carregar a classe interna apenas por um detalhe, não estava usando o cifrão para separar a classe principal da classe interna. Depois que coloquei o bendito cifrão no lugar, tudo se iluminou.

Obrigado pela ajuda, alias, muito obrigado mesmo.

Criado 28 de fevereiro de 2012
Ultima resposta 1 de mar. de 2012
Respostas 12
Participantes 3