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做吗?我的意思是,以这种方式调用匿名类的方法?
答案 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>
。