我是否可以使用某些语法访问匿名内部类中的新方法?

2022-09-02 20:07:18

是否有任何 Java 语法可以从外部类访问在匿名内部类中定义的新方法?我知道可以有各种解决方法,但我想知道是否存在特殊语法?

例如

class Outer {

    ActionListener listener = new ActionListener() {

        @Override
        void actionPerformed(ActionEvent e) { 
             // do something
        }

        // method is public so can be accessible
        public void MyGloriousMethod() {
             // viva!
        }

    };

    public void Caller() {
         listener.MyGloriousMethod(); // does not work!
    }


}

我自己的解决方案

我只是将所有方法和成员都移到了外部类。


答案 1

一旦匿名类实例隐式转换为命名类型,就无法将其强制转换回去,因为匿名类型没有名称。您可以通过在类内访问匿名内部类的其他成员,在表达式之后的表达式中,可以通过方法调用来推断和返回类型。this

Object obj = new Object() {
    void fn() {
        System.err.println("fn");
    }
    @Override public String toString() {
        fn();
        return "";
    } 
};
obj.toString();



new Object() {
    void fn() {
        System.err.println("fn");
    }
}.fn();


identity(new Object() {
    void fn() {
        System.err.println("fn");
    }
}).fn();
...
private static <T> T identity(T value) {
    return value;
}

答案 2

我班上的一个学生问我们的教授,前几天是否可以这样做。以下是我写的一个很酷的概念证明,它可以做到,虽然不值得,但它实际上是可能的,这是如何做到的:

public static void main(String[] args){

    //anonymous inner class with method defined inside which
    //does not override anything
    Object o = new Object()
    {
        public int test = 5;
        public void sayHello()
        {
            System.out.println("Hello World");
        }
    };

    //o.sayHello();//Does not work

    try 
    {
        Method m = o.getClass().getMethod("sayHello");
        Field f = o.getClass().getField("test");
        System.out.println(f.getInt(o));
        m.invoke(o);
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

通过使用Java的Method类,我们可以通过传入方法的字符串值和参数来调用方法。字段也可以执行相同的操作。

只是觉得分享这个会很酷!