Me deparei com uma limitação estranha quanto a instanciação dinâmica de um objeto quando seu tipo é uma Inner Class, a JVM lança uma InstantiationException quando executa o método Class.newInstance(), segue o código :
public class Teste {
public static void main(String[] args) {
Teste teste = new Teste();
teste.metodo();
}
private void metodo(){
Class clazz = Inner.class;
try{
Inner inner = (Inner) clazz.newInstance();
}catch( Exception e ){
e.printStackTrace();
}
}
private class Inner{
}
}
Já tentei usar o Class,forName() com o nome binário ( Teste$Inner ) , mas tb não funcionou.
Pelo visto o Java não consegue fazer a ligação do inner object com o enclosing object quando usando newInstance().
Já olhei na JLS e não achei nada a respeito.
Alguém sabe contornar isso , ou me dizer o porquê ?
Agradeço desde já.
Engrassado, pegando o contrutor e passando a classe outter como parametro, rola :Fade-color :rainbowafro:
import java.lang.reflect.*;
public class Teste {
public static void main(String[] args) {
Teste teste = new Teste();
teste.metodo();
}
private void metodo(){
// Class clazz = Inner.class;
Class clazz = getClass();
try{
// Inner inner = (Inner)clazz.getDeclaredClasses().newInstance();
Class classes [] = clazz.getDeclaredClasses();
System.out.println(" = > " + classes.length);
Class innerClass = classes[0].getClassLoader().loadClass("samples.Teste$Inner");
Teste outerInstance= new Teste();
// Get the Constructor with no declared Parameter, remember to use
// Teste.class not Object.class
Constructor construct= innerClass.getConstructor(new Class[]{Teste.class});
construct.newInstance( new Object[]{outerInstance});
}catch( Exception e ){
e.printStackTrace();
}
}
class Inner{
public Inner(){System.out.println("Sucesso!!!");}
}
}
Kra valeu mesmo, este é o comportamento mais estranho que já ví no Java, não existe documentação sobre este constructor que recebe o outerclass, mas simplesmente funciona, segue o código um pouco mais simples :
import java.lang.reflect.*;
public class Teste {
public static void main(String[] args) {
Teste teste = new Teste();
teste.metodo();
}
private void metodo(){
Class clazz = Inner.class;
try{
Constructor cons = clazz.getDeclaredConstructor( new Class[]{Teste.class});
Inner inner = (Inner) cons.newInstance( new Object[]{this});
}catch( Exception e ){
e.printStackTrace();
}
}
class Inner{
public Inner(){System.out.println("Sucesso!!!");}
}
}