繁体   English   中英

如何访问“未命名”类的方法?

[英]How can I access a method of an “unnamed” class?

public class Test {
    public static void main(String[] args) {
        DemoAbstractClass abstractClass = new DemoAbstractClass() {
            private String val;

            @Override
            public void runner() {
                val = "test";
                System.out.println(val);
                this.run();
            }

            public String getVal() {
                return val;
            }
        };

        abstractClass.runner();

        /**
         * I want to access getVal method here
         */
    }
}

abstract class DemoAbstractClass {
    public void run() {
        System.out.println("running");
    }

    public abstract void runner();
}

在这里,我声明一个抽象类DemoAbstractClass。 很明显,我可以创建一个扩展该类的新类并将此方法添加到其中。 但是,我不希望在我的情况下这样做。 上面的代码中还有其他方法可以访问getVal方法吗?

你不能 您需要从中做出适当的(非一致)类。 如果要限制其范围,请使其成为内部私有类。

另外,您可以使用StringBuffer并在方法之间共享对其的引用。 但是不是很干净。

相关问题:

缺少使用反射,您无法访问对象的具体类型,因此无法将方法调用绑定到

如果您不想以理性的方式执行此类操作,请声明一个命名类并将其用作abstractClass的类型。

不幸的是,如果您不能命名类型,则无法在语言级别访问方法。

但是,您可以使用反射API获取Method对象并在该对象上invoke它。

但是,这非常慢。 私有类或私有接口会更快。

很明显,我可以创建一个扩展该类的新类并将此方法添加到其中。

您已经做到了; 最终结果是一个匿名的内部类: new DemoAbstractClass() { ... }; 如果只是将该声明移到其自己的类中(甚至可以将其设为私有类),则可以访问getVal。

根据上面的示例:

public class Test {
    public static void main(String[] args) {
        DemoClass abstractClass = new DemoClass();

        abstractClass.runner();

        /**
         * I want to access getVal method here
         */
        abstractClass.getVal(); // can do this here now
    }

    private class DemoClass extends DemoAbstractClass {

            private String val;

            @Override
            public void runner() {
                val = "test";
                System.out.println(val);
                this.run();
            }

            public String getVal() {
                return val;
            }
        }
    }
}

另一种选择是使StringBuilder成为main方法的成员,并使用匿名内部方法的闭包特性:

public static void main(String[] args) {
    final StringBuilder value = new StringBuilder();
    DemoAbstractClass abstractClass = new DemoAbstractClass() {
        @Override
        public void runner() {
            value.append( "test" );
            System.out.println(val);
            this.run();
        }
    };

    abstractClass.runner();

    // use val here...
    String val = value.toString();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM