2015-10-27 3 views
1

У меня возникли проблемы с созданием внутреннего класса с использованием отражения. Вот пример.Java - Как создать экземпляр внутреннего класса с отражением?

public final class Cow { 

    public Cow (Bufallo flying, Horse swimming, int cowID, int numCows) { 
     //This is where the part I really dont know what the cow is doing 
    } 

    public Bull eatGrass(String grassName, AngusCattle farmName, JerseyCattle farmName){ 
     Ox newBreed = new Ox(australiaFarm, somewhereOutThere); 
     //Something that has to do with cow eating grass 
     return Bull; 
    } 

    private static final class Ox extends BigHorns { 

     public Ox (AngusCattle farmName, ChianinaOx farmName) { 
      //Something about mating 
     } 

    } 

} 

все, что я хочу, это получить конструктор или просто создать экземпляр внутреннего класса. Мой код до сих пор ...

CowManager cowManager = (CowManager) this.getSystemService(Context.COW_SERVICE); 
final Class MainCowClass = Class.forName(cowManager.getClass().getName()); 
final Class[] howManyCows = MainCowClass.getDeclaredClasses(); 
Class getCow = null; 
for (int i=0; i < howManyCows.length; i++) { 
    if (! howManyCows[i].getName().equals("Cow$Ox")) { 
     continue; 
    } 
    getCow = Class.forName(howManyCows[i].getName()); 
} 
Constructor createCow = getCow.getDeclaredConstructor(); 

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

ответ

0

Вы должны сначала открыть внутренний класс, делая что-то вроде ниже

// Straightforward parent class initializing 
Class<?> cowClass = Class.forName("com.sample.Cow"); 
Object cowClassInstance = cowClass.newInstance(); 

// attempt to find the inner class 
Class<?> oxClass = Class.forName("com.sample.Cow$Ox"); 

// Now find the instance of the inner class, you may need to pass in arguments for the constructor 
Constructor<?> oxClassContructor = oxClass.getDeclaredConstructor(cowClass); 

// initialize the inner instance using the parent class's (cow's) instance 
Object oxClassInstance = oxClassContructor.newInstance(cowClassInstance); 

Редактировать

конструкторы должны выглядеть, как показано ниже

// define the type of args that the constructor requires. 
oxClass.getDeclaredConstructor(com.sample.AngusCattle.class, com.sample.ChianinaOx.class); 
// now init the constructor with the required args. 
Object oxClassInstance = oxClassContructor.newInstance(cowClassInstance, angusCattleClassInstance, chianinaOxClassInstance); 
+0

Я получаю java.lang.InstantiationException: класс com.sample.Cow не имеет конструктора аргументов нуля, когда я делаю команду cowClassInstance. –

+0

Я также хочу добавить, почему мне нужно создать новый экземпляр, когда я уже создал новый экземпляр 'CowManager cowManager = (CowManager) this.getSystemService (Context.COW_SERVICE);'? Означает ли это, что я должен создать новый экземпляр? или заменить код кодом? –

+0

Ошибка «no zero argument» означает, что вы не передаете необходимые аргументы для инициализации конструктора. Я упомянул об этом в комментариях. И нет, если у вас уже есть экземпляр класса, тогда вам не нужно создавать новый экземпляр. –

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