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
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
Está colocando o caminho completo?
Já tentei de todo jeito possivel, inclusive alternando entre pontos e barras, letra do drive e nada
o caminho seria TA01/src/ta01/TNFE/IDE de acordo com a arvore de arquivos do classpath
existe algum formato especifico para este caminho ?
A separação é por ponto à partir do src.
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);
}
}
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:
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.
Fazendo da segunda forma há 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.
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 ?
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.
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.