【问题标题】:Invoking method of anonymous class匿名类的调用方法
【发布时间】:2016-01-29 08:35:35
【问题描述】:

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做吗?我的意思是,这样调用匿名类的方法?

【问题讨论】:

  • 你到底想调用什么方法?
  • @sp00m m() 的匿名类。

标签: java class methods anonymous-class


【解决方案1】:

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

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

new Test(){                                                
   public void m(){                                                

   }  
}.m();

根据oracle文档here的定义:

匿名类使您的代码更简洁。他们 使您能够同时声明和实例化一个类。他们 类似于本地类,只是它们没有名称。使用它们 如果您需要只使用一次本地类

因此,如果您必须使用类的方法之一,则必须创建一个本地方法

【讨论】:

  • m() 返回void,因此不能将其分配给t
【解决方案2】:

你不能使用普通的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);

【讨论】:

    【解决方案3】:

    这是一种方法:

    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&lt;V&gt;

    【讨论】:

    • 这不是调用封闭类...这与在m() 中执行this.m() 相同。
    • 它正在调用最封闭类的实例方法。
    • 你能标出代码中会调用哪个m()方法吗?我是说它只会调用其中包含r.run() 语句的m() 方法......这可以通过放置this.m() 而不是r.run() 来实现。
    • @Codebender 更新了我的答案。
    • @Codebender 更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2018-05-16
    相关资源
    最近更新 更多