2016-12-14 4 views
-1

У меня возникла проблема с отражением и вызовом только определенных методов. В моем случае я хочу вызвать метод getMyStuff(), который может быть определен более чем в одном классе.Java, отражение и вызов метода

Мои занятия похожи на это. MainClass всегда будет родителем. У меня много классов, и не все классы имеют метод getMyStuff(). Я хочу, чтобы иметь возможность вызвать этот метод и получить доступ к возвращаемому значению. Я пробовал много воплощений кода, чтобы получить доступ, но ничего не работает.

Любые идеи, Благодаря

class MainClass 
{ 
    public ClassA member1; 
    public String getMyStuff() {} 
} 


class ClassA 
{ 
    public ClassB member1; 
    public String getMyStuff() {} 
} 


class ClassB 
{ 
    public String getMyStuff() {} 
} 
+1

И в чем проблема? Вы думали об использовании наследования или создании интерфейса для 'getMyStuff'? – Tom

+0

В чем именно проблема? Ваш код отражения не работает? У вас проблемы с пониманием концепции? –

+0

создайте лучший http://stackoverflow.com/help/mcve, чтобы объяснить вашу проблему. – StackFlowed

ответ

0

Почему вы не расширить от MainClass и переопределить getMyStuff(), где это необходимо?

+0

У меня не было нового вопроса. Поскольку Reflection медленнее в Java, я предлагаю продлить его из MainClass. Также наследование - хорошее решение. –

+0

Извините, что плохо, но в любом случае, когда вы отвечаете, вы должны дать прямой ответ, а не вопрос, как ответ. Кроме того, это лучше подходит как комментарий, а как ответ .... – coder

+0

Я бы добавил комментарий, но, к сожалению, у меня еще нет 50 очков репутации :) –

0

Во-первых перейти свой класс и проверить, если класс имеет метод, который вы хотите:

Class c = ob.getClass(); 
for (Method method : c.getDeclaredMethods()) { 
System.out.println(method.getName()); 
// check for the getMyStuff() method 
} 

если метод существует создать экземпляр этого класса и вызвать метод:

Class<?> clazz = Class.forName(className); 
Constructor<?> ctor = clazz.getConstructor(String.class); 
Object object = ctor.newInstance(new Object[] { ctorArgument }); 
+0

Я считаю, что мне удалось добиться успеха, когда getMyStuff() находится в MainClass. Однако, как только метод привязан к переменной-члену «member1» или внутри «ClassB», я не уверен, как получить к ней доступ. – GOOGGOOG

1

You может вызвать метод, используя отражение следующим образом:

public static String getMyStuff(Object o) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
    Class<?> cl = o.getClass(); 
    Method m = cl.getMethod("getMyStuff"); 
    return (String) m.invoke(o); 
} 

Однако было бы гораздо проще объявление d метода к интерфейсу и реализовать этот интерфейс с классами

public interface MyStuffContainer { 
    public String getMyStuff(); 
} 

class ClassA implements MyStuffContainer 
{ 
    public ClassB member1; 
    public String getMyStuff() {} 
} 

public static String getMyStuff(Object o) { 
    if (!(o instanceof MyStuffContainer)) 
     throw new IllegalArgumentException(); 
    return ((MyStuffContainer)o).getMyStuff(); 
} 

Статический getMyStuff метод вызывается, как это в обоих случаях:

getMyStuff(new MainClass()); 
getMyStuff(new ClassA()); 
getMyStuff(new ClassB()); 
+0

Хорошее решение, не говоря уже о том, что отражение в java довольно медленное! – RoiEX

+0

Я вижу, как работает «public static String getMyStuff (Object o)», и это близко к тому, что у меня есть. Однако я не уверен и не смог понять, как перебирать элементы основного класса и передавать их как объект в этот метод. Интерфейс, хотя и хорошая идея, будет слишком громоздким для этого проекта. – GOOGGOOG

0

Я решил сегодня. Главное, с чем я столкнулся, это то, как захватить/получить доступ к объектам в ClassA и ClassB. Я думал, вам нужно как-то перебирать объект, и по очереди обращаться к каждому объекту. Однако отражение имеет другую парадигму. Вы перебираете все поля через getDeclaredFields(). Как только вы получите объект Field для поля «Поле field = aClass.getField (« someField »); вам необходимо использовать объект «Поле» для доступа к базовому объекту для этого поля «Object value = field.get (objectValue)»;

Я знаю, что это не очень хорошее объяснение, но по существу я не понял, что вам сначала нужно было получить доступ к полю, передать объект, в котором находится поле, а затем «field.get (objectValue)» заглядывает в объект objectValue и возвращает объект с этим именем поля. Вспомните, как я думаю.

Спасибо за помощь.

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