对于以下代码示例,当我们执行代码时,它将打印:
来自实例方法
来自当地的内部阶级
现在,如果我只想执行本地内部类方法m2()并希望输出为:
来自本地内部阶级
class A {
void m1() {
class B {
void m2() {
System.out.println("from local inner class");
}
}
System.out.println("from instance method");
B b = new B();
b.m2();
}
public static void main(String[] args) {
A a = new A();
a.m1();
}
}
当绝对需要局部内部类而没有某些功能可能无法实现时,确切的用例是什么。
答案 0 :(得分:1)
我看不到您在做什么,也许您想将方法的创建与方法的调用分开,将所有实现细节隐藏在内部类中?如果是这样的话。...
首先创建一个接口,以使您知道要访问的类型(比反射更整齐)
interface X {
void m2()
}
现在方法m1()返回实现接口的类的实例
class A {
X m1() {
class B {
void m2() {
System.out.println("from local inner class");
}
}
B b = new B();
return b;
}
public static void main(String[] args) {
A a = new A();
// call m1() to get an instance of interface X
X x = a.m1();
// invoke method on interface instance
x.m2()
}
}
这将方法的创建(包装在类中,认为是“ functor”)与方法的调用分开了。
答案 1 :(得分:0)
您可以从函数返回本地类类型的对象,并通过反射对其调用方法,例如以下作品:
class A {
Object m1() {
class B {
public void m2() {
System.out.println("from local inner class");
}
}
System.out.println("from instance method");
B b = new B();
b.m2();
return b;
}
public static void main(String[] args) {
try {
A a = new A();
Object obj = a.m1();
obj.getClass().getMethod("m2").invoke(obj);
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
您应该这样做吗?可能不是。