Получение метода через отражение - PullRequest
0 голосов
/ 14 июля 2011

Мой предыдущий пост был не очень понятным, извините за это.Я попытаюсь привести лучший пример того, что я пытаюсь сделать.

У меня есть приложение Java, которое загружает файлы .class и запускает их в специальной среде (приложение Java имеет встроенные функции)Примечание: Это не библиотека.

Это приложение Java затем отобразит апплет, и я хочу изменить переменные в апплете.

Основной класс апплета называется «клиент»».Приложение Java загрузит апплет, создав новый экземпляр класса «клиент».

Я уже получил доступ к классу «клиент».приложение Java поместит апплет в переменную:

Applet client = (Applet) loadedClientClass.newInstance();

Итак, я сделал это:

Class<?> class_client = client.getClass();

Теперь я могу читать и устанавливать поля, но класс 'client' вызоветфунция другого класса, как это:

otherClass.someVoid(false);

И если я попробую что-то вроде:

class_client.getDeclaredMethod("otherClass.someVoid",boolean.class);

Это не удастся, сказав, что функция не может быть найдена.

'otherClass' - это прямое имя класса, насколько я знаю, это не ссылка на новый экземпляр класса.

Есть ли способ получить 'otherClass.someVoid'?

Ответы [ 3 ]

0 голосов
/ 14 июля 2011

Есть ли способ изменить 'otherClass.someInteger' через класс 'mainClass'?

Нет.

Но вы можете получить его через класс OtherClass через Class.forName:

Class<?> theOtherClazz = Class.forName("OtherClass");

И затем получить методы через theOtherClazz.getDeclaredMethod

0 голосов
/ 16 июля 2011

Вы используете getDeclaredMethod как статический метод (ожидая, что он возвратит методы из любого класса), но он возвращает метод только из самого класса.Вот как можно позвонить otherClass.someVoid(false).

Class<?> otherClass = Class.forName("com.xyz.OtherClass"); // Get the class
Method method = otherClass.getDeclaredMethod("someVoid", boolean.class);

// If the method is an Class (ie static) method, invoke it on the Class:
method.invoke(otherClass, false);

// If the method is an instance (ie non-static) method, invoke it on an instance of the Class:
Object otherInstance = otherClass.newInstance(); // Get an instance of other class - this approach assumes there is a default constructor
method.invoke(otherInstance, false);
0 голосов
/ 14 июля 2011

Если класс не инициализирован, переменная someInteger не существует.Это переменная-член, поэтому она существует только внутри экземпляров класса.Таким образом, вы не можете изменить его, так как он не существует.Теперь, если вы сделали это статической переменной, вы можете изменить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...