Java中的局部内部类

Java中的局部内部类,java,inner-classes,Java,Inner Classes,对于下面的代码示例,当我们执行代码时,它将打印: 从实例方法 来自本地内部类 现在,如果我只想执行本地内部类方法m2,并希望输出为: 来自本地内部类 当完全需要本地内部类时,具体的用例是什么?如果没有本地内部类,某些功能可能无法实现。我看不出您的意图,也许您希望将方法的创建与方法的调用分开,将所有实现细节隐藏在内部类中?如果是这样的话,这个怎么样 首先创建一个接口,这样您就知道要访问的类型比反射类型更整洁 interface X { void m2() } 现在,方法m1返回类实现接口

对于下面的代码示例,当我们执行代码时,它将打印:

从实例方法 来自本地内部类

现在,如果我只想执行本地内部类方法m2,并希望输出为:

来自本地内部类


当完全需要本地内部类时,具体的用例是什么?如果没有本地内部类,某些功能可能无法实现。

我看不出您的意图,也许您希望将方法的创建与方法的调用分开,将所有实现细节隐藏在内部类中?如果是这样的话,这个怎么样

首先创建一个接口,这样您就知道要访问的类型比反射类型更整洁

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”)与调用该方法分开

您可以从函数返回本地类类型的对象,并通过反射对其调用方法,例如,以下工作:

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());   
        }   
    }
}

你应该这样做吗?可能不会。

如果您只想执行一个println,那么。。。犯错误移除另一个?我想知道,有没有一种方法可以只执行m2?方法的局部性的想法是,它应该只在该方法中使用。因此,如果您想从m1外部调用m2,为什么要将B设为m1的本地呢?我想知道,有没有一种方法可以只执行m2?从技术上讲,是的。您可以让m1返回一个B的对象,然后使用反射在m1之外调用m2,我认为.m2在m1方法之外是不可见的。要仅执行m2,请向m1方法添加一个布尔参数,并使用if语句来决定是只执行m2还是整个m1
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());   
        }   
    }
}