2013-09-30 4 views
4

Привет, я хочу получить объект внутреннего класса, используя отражение, но я получаю некоторую ошибку в нем.java, reflection, innerclass,

код: -

package reflaction; 
public class MyReflection { 
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
    Class obj = Class.forName("reflaction.MyReflection$TestReflection"); 
    TestReflection a = (TestReflection) obj.newInstance(); 
    a.demo(); 
} 

class TestReflection { 

    public void demo(){ 
     System.out.println("reflection occurs"); 
    } 
    } 
} 

и ошибка: -

Exception in thread "main" java.lang.InstantiationException: reflaction.MyReflection$TestReflection 
    at java.lang.Class.newInstance0(Class.java:357) 
    at java.lang.Class.newInstance(Class.java:325) 
    at reflaction.MyReflection.main(MyReflection.java:10) 

ответ

2

Используйте это:

public class MyReflection { 

public static void main(String[] args) throws ClassNotFoundException, 
     InstantiationException, IllegalAccessException, 
     NoSuchMethodException, SecurityException, IllegalArgumentException, 
     InvocationTargetException { 
    Class outer = Class.forName("reflaction.MyReflection"); 
    Object outerInstance = outer.newInstance(); 

    Class<?> inner = Class 
      .forName("reflaction.MyReflection$TestReflection"); 
    Constructor<?> constructor = inner.getDeclaredConstructor(outer); 

    TestReflection innerInstance = (TestReflection) constructor 
      .newInstance(outerInstance); 

    innerInstance.demo(); 
} 

class TestReflection { 

    public void demo() { 
     System.out.println("reflection occurs"); 
    } 
} 

Посмотрите на JavadocgetDeclaredConstructor(Class<?>... parameterTypes). В нем написано:

... Если этот объект класса представляет собой внутренний класс, объявленный в нестатическом контексте, формальные типы параметров включают явный вмещающий экземпляр в качестве первого параметра.

Таким образом, давая охватывающий экземпляр в качестве первого параметра создашь новый экземпляр внутреннего класса:

TestReflection innerInstance = (TestReflection) constructor 
      .newInstance(outerInstance); 
0

Во-первых, не статическую внутренний класс может быть реализован только с использованием экземпляра внешнего класса, как

Outer outer = new Outer(); 
Inner inner = outer.new Inner(); 

Во-вторых - насколько я знаю, java-отражение api не обеспечивает возможность создания экземпляра нестатического i nner. Это возможно только для статических. Поэтому, если вам не нужен внутренний класс для динамического отображения и ссылки на внешний экземпляр, просто добавьте модификатор «static» для внутреннего класса, и ваш код будет работать.

+0

Это обеспечивает ей, добавив скрытый аргумент для всех нестатических внутренних конструкторов класса, который принимает экземпляр класса вмещающего. – SamYonnou

+0

Большое спасибо, на самом деле этого не знали. –

0

набор TestReflection класса static, как:

package reflaction; 

public class MyReflection { 
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 

    Class<?> obj = Class.forName("reflaction.MyReflection$TestReflection"); 
    TestReflection a = (TestReflection) obj.newInstance(); 
    a.demo(); 
} 

static class TestReflection { 

    public void demo(){ 
     System.out.println("reflection occurs"); 
    } 
} 
} 

Другой способ заключается в создании MyReflection экземпляра аки: Class.forName("reflaction.MyReflection").newInstance(); и после того, как от этого экземпляра нагрузки "reflaction.MyReflection$TestReflection"

1

Поскольку TestReflection является внутренним классом может существовать только внутри экземпляра внешнего класса TestReflection , Таким образом, вы должны предоставить экземпляр TestReflection при создании экземпляра внутреннего класса.

Используй это:

public class MyReflection { 

    public static void main(String[] args) throws Exception { 
     Class<?> testReflectionClass = Class 
       .forName("reflection.MyReflection$TestReflection"); 
     MyReflection myReflection = new MyReflection(); 
     Object newInstance = testReflectionClass.getDeclaredConstructor(
       MyReflection.class).newInstance(myReflection); 
     TestReflection testReflection = (TestReflection) newInstance; 
     testReflection.demo(); 
    } 

    class TestReflection { 

     public void demo() { 
      System.out.println("reflection occurs"); 
     } 
    } 

}