2013-06-25 4 views
1

У меня есть класс, который содержит пару разных объектов.использовать переменную как имя объекта для вызова метода объекта

Я могу использовать getDeclaredFields, чтобы получить список имен всех объектов, , но я хочу вызвать метод в этих объектах.
Как я могу это сделать?

ClassA a = new ClassA(); 
Class cls = c.getClass(); 
Field[] fields = cls.getDeclaredFields(); 
for(int i = 0; i< fields.length;i++) { 
    System.out.println("Field = " + fields[i].toString()); 
    System.out.prontln(fields[i].method()) // how can I call the method from object fields[i]    
} 

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

testclass (класс a), получить все имена объектов в классе a и использовать метод object.exists() для проверки существующего объекта.

вот мой код: у меня есть несколько классов диалога, каждый класс диалога имеет некоторый класс menuitem, класс checkbox, класс textfield, я хочу написать класс, который можно использовать для проверки всех checboxes, текстовых полей exsting (используйте флажок. exist(), textfield.exist() ...) в данном диалоговом окне.

ToolsMenu c = new ToolsMenu(); 
     Class cls = c.getClass(); 
     Field[] fields = cls.getDeclaredFields(); 
     for(int i = 0; i< fields.length;i++) { 
      System.out.println("Field = " + fields[i].toString()); 
      println(fields[i].getDeclaringClass().exists() 

можно использовать, чтобы получить getdeclaringclass поля [я] класс, но как могу я вызвать метод существует(), который определен в флажках, текстовые поля класса.

+0

Ну, какой тип интересующего вас поля и какой метод? –

+0

Я предлагаю вам google "java reflection api". О том, как это сделать, доступно множество учебных пособий. Но тогда мой вопрос: почему вы используете отражение в первую очередь? –

+3

Вы пытаетесь вызвать только какой-либо метод или знаете о сигнатуре метода? –

ответ

3

Вы можете назвать это что-то вроде этого:

... 
Class clazz= fields[i].get(c).getClass(); 
clazz.getMethod("methodName").invoke(fields[i].get(c)); 
... 

Где "methodName" это имя метода, который должен быть вызван. Вы также можете передать некоторые параметры методу.

+0

Вы должны использовать c вместо cls –

+0

Вы правы. Я исправлю это. Благодарю. –

+0

Поля [i] вернут имя объекта, я не думаю, что мы можем использовать строку для вызова метода объекта. – bitma

2

Я не уверен, почему вы используете отражение вообще. Вы можете просто сделать

a.field.method() 

Если field и его method() объявить правильные модификаторы доступа.

+0

Я думаю, что 'method()' был примером, и OP не знает имя метода, который он вызывает, поэтому он использует отражение. Однако это не имеет большого смысла в себе ... – selig

+0

Поле - это строка в поле [], как я могу передать его классу ?. – bitma

+0

перед использованием объявленного поля, я не знаю имя поля, после объявленного поля, можно ли использовать a.field [i] .method()? – bitma