2014-12-27 2 views
0

У меня есть класс PersonStoryDerivedTest, который имеет внутренний класс InnerClass, который имеет в нем функцию foo.вызов метода внутреннего класса с использованием внешнего экземпляра класса

Если у меня есть только экземпляр объекта PersonStoryDerivedTest, и у меня нет имени класса/конструктора/методов ... и я хочу вызвать foo (я знаю, что это второй метод в внутреннем классе hte). как мне это сделать?

public class PersonStoryDerivedTest extends PersonStoryTest { 

    private void thePersonRests(Integer hours) { 
     person.rest(hours); 
    } 

    public void ff(String g){ 
     System.out.println("Alex"); 
    } 

    public class InnerClass extends PersonStoryTest { 
     public void aPerson(Integer age) { 
      person = new Person(age); 
     } 

     public void foo(String g){ 
      System.out.println("David"); 
     } 
    } 
} 

public class test { 

    public static void main(String[] args) { 

     PersonStoryDerivedTest a = new PersonStoryDerivedTest(); 
     Method[] g1 = a.getClass().getDeclaredMethods(); 
     g1[1].invoke(a,"fff"); // print Alex (works well) 

     PersonStoryDerivedTest.InnerClass ab = a.new InnerClass(); 
     Class<?>[] b = a.getClass().getDeclaredClasses(); 
     Method[] g = b[0].getDeclaredMethods(); 
     g[1].invoke(ab,"fff"); // print David (works well) 
     g[1].invoke(b[0] ,"fff"); // (does not work... how can I create the appropriate instance  needed by only having b[0]) 
     } 
} 

Thnx

+0

возможно дубликат [Как проверить класс, который имеет частные методы, поле или внутренние классы] (HTTP : //stackoverflow.com/questions/34571/how-to-test-a-class-that-has-private-methods-fields-or-inner-classes) – jruizaranguren

ответ

0

Я думаю, что вы слишком много хотите от рефлексии, смотри, например: Is it possible in java to create 'blank' instance of class without no-arg constructor using reflection?

следующие работы, но только если добавить конструкторы классов. Когда неты Конструкторов, я не мог заставить его работать:

public class Person 
{ 
    public Person(int age) 
    { 
     System.out.println("person with age " + age); 
    } 
    public void rest(int hours) 
    { 
     System.out.println("person rests " + hours); 
    } 
} 

public class PersonStoryDerivedTest extends PersonStoryTest { 
    public PersonStoryDerivedTest() 
    { 
     System.out.println("PersonStoryDerivedTest cnstr."); 
    } 
    private void thePersonRests(Integer hours) { 
     person.rest(hours); 
    } 
    public void ff(String g){ 
     System.out.println("Alex"); 
    } 

    public class InnerClass extends PersonStoryTest { 
     public InnerClass() { System.out.println("InnerClass cnstr."); } 
     public void aPerson(Integer age) { 
      person = new Person(age); 
     } 

     public void foo(String g){ 
      System.out.println("David"); 
     } 
    } 
} 

public class PersonStoryTest 
{ 
    public PersonStoryTest() 
    { 
     System.out.println("PersonStoryTest cnstr."); 
    } 
    Person person; 
} 

import java.lang.reflect.*; 
public class test { 
public static void main(String[] args) throws Exception { 
    PersonStoryDerivedTest a = new PersonStoryDerivedTest(); 
    Method[] g1 = a.getClass().getDeclaredMethods(); 
    g1[1].invoke(a,"fff"); // print Alex (works well) 

    PersonStoryDerivedTest.InnerClass ab = a.new InnerClass(); 
    Class<?>[] b = a.getClass().getDeclaredClasses(); 
    Method[] g = b[0].getDeclaredMethods(); 
    g[1].invoke(ab,"fff"); // print David (works well) 
    Constructor<?>[] cs = b[0].getConstructors(); 
    Object o = cs[0].newInstance(a); 
    g[1].invoke(o ,"fff"); // now works too... 
    } 
} 

печатает выход:

PersonStoryTest cnstr. 
PersonStoryDerivedTest cnstr. 
Alex 
PersonStoryTest cnstr. 
InnerClass cnstr. 
David 
PersonStoryTest cnstr. 
InnerClass cnstr. 
David 
+0

thnx alot !!!!! что я не понимаю, что вы посылаете «a» на «newInstance» ?? –

+0

Добро пожаловать, это было весело. Мне показалось, что он похож на алхимию, но некоторые поиски показывают, что это популярная тема: http://jroller.com/tomdz/entry/reflection_inner_classes http://stackoverflow.com/questions/728842/instantiating-an -интернет-класс и список можно продолжать ... – Palo

0

Экземпляр внешний класс не имеет ссылку на экземпляр внутреннего класса. Только внутренний экземпляр класса имеет ссылку на экземпляр внешнего класса. Несколько экземпляров внутреннего класса могут иметь ссылку на один и тот же экземпляр внешнего класса.

+0

, но я могу получить внутренний класс: «Класс [] b = a.getClass(). getDeclaredClasses(); " –

+1

Класс представляет собой структуру статического типа. Для вызова метода вам нужен экземпляр класса, а не его тип. – Gene

+0

true .. но как я могу создать этот экземпляр, используя только экземпляр класса outter + Reflection? –

Смежные вопросы