Как я могу получить ссылку на анонимный метод внутреннего класса 'helloWorld' извне, используя отражение - PullRequest
0 голосов
/ 05 июня 2018

Ниже приведен пример моего класса.Как видите, я определил класс InnerClass и в методе main создал его экземпляр.Но вместо обычного объявления я объявил его анонимный внутренний класс с методом, которого нет в базовом классе.

Теперь я знаю, что если я объявлю helloWorld() внутри InnerClass, то я смогу получить доступ к этомуметод в экземпляре, созданном через анонимный внутренний класс.

Но я хочу знать, можно ли вызвать этот метод без объявления базового класса в моем коде.Я попытался изучить API отражения, но мне не повезло

import java.lang.reflect.Method;

public class InnerClass {
int i = 10;

public static void main(String[] args) {
    InnerClass inner = new InnerClass() {
        void helloWorld() {
            System.out.println("Hello");
            System.out.println(this.getClass().getEnclosingMethod());
        }
    };
    System.out.println(inner.getClass().getEnclosingMethod());
    Method[] method = inner.getClass().getDeclaredMethods();

    // Call helloworld method here

    for (Method me : method) {
        System.out.println(me.getName());
    }
}
}

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

В приведенном ниже коде используется getDeclaredMethod для поиска Method, который вы хотите, а затем вызывает invoke для его вызова.

import java.lang.reflect.*;

public class InnerClass {

    public static void main(String[] args) {
        InnerClass inner = new InnerClass() {
            void helloWorld() {
                System.out.println("Hello");
                System.out.println(this.getClass().getEnclosingMethod());
            }
        };

        try {
            Method m = inner.getClass().getDeclaredMethod("helloWorld");
            m.invoke(inner);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

Вывод:

Hello
public static void InnerClass.main(java.lang.String[])
0 голосов
/ 05 июня 2018

getDeclaredMethod возвращает метод, который можно выполнить с помощью invoke:

Method method = inner.getClass().getDeclaredMethod("helloWorld");
method.invoke(inner);
...