调用匿名类的方法

时间:2016-01-29 08:35:36

标签: java class methods anonymous-class

Java 7

首先,我将简化示例以避免发布不必要的代码。我具体的具体例子有点复杂,但我'尽力保持这一点。

public class Test {

    public static void main(String[] args){
        Test t = new Test(){ //<---------------------------------------------------------
            public void m(){ //                                                         |
                Test t = new Test(){//                                                  |
                    public void m(){//                                                  |
                        //Here I need to invoke the most inclosing class's m() method 
                    }
                    //other actions
                };
            }

            public void someMethod(){
                //action
            }
        };
    }

    public void m(){

    }
}

可以用Java做吗?我的意思是,以这种方式调用匿名类的方法?

3 个答案:

答案 0 :(得分:3)

它不可能因为没有对匿名类的引用。

这是调用实例m()方法的唯一可行方法:

new Test(){                                                
   public void m(){                                                

   }  
}.m();

根据oracle文档here的定义:

  

匿名类使您可以使代码更简洁。他们   使您能够同时声明和实例化一个类。他们   就像当地的班级,除了他们没有名字。使用它们   如果您只需要使用本地课程一次

因此,如果您必须使用课程中的某种方法,则必须创建本地方法

答案 1 :(得分:1)

您无法使用普通java访问匿名类的方法,但您可以使用反射:

Test t = new Test{
    public void m() {
        System.out.println("Welcome to my class");
    }
};
Class<?> c = t.getClass();
Method m = c.getDeclaredMethod("m");
// m.setaccessible(true); // if private
m.invoke(t);

答案 2 :(得分:1)

这是一种方法:

public class Test
{
    public static void main(String[] args)
    {
        Test t = new Test()
        {
            public void m() // this one will be called  
            {
                Runnable r = new Runnable()
                {
                    @Override
                    public void run()
                    {
                        m();
                    }
                };

                Test t = new Test()
                {
                    public void m()
                    {
                        r.run();
                    }
                };
            }
        };
    }

    public void m()
    {

    }
}

如果方法返回值,请改用Callable<V>