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

时间:2012-06-14 15:39:49

标签: java inheritance abstract-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 方法?

5 个答案:

答案 0 :(得分:6)

你做不到。你需要制作一个合适的(非恶性的)课程。如果要限制其范围,请将其设为内部私有类。

或者,您可以使用StringBuffer并在方法之间共享它的引用。但不是很干净。

相关问题:

答案 1 :(得分:1)

如果没有使用反射,则无法访问具体类型的对象,无法将方法调用绑定到

如果您不想以理智的方式做这样的事情,请声明一个命名类并将其用作abstractClass的类型

答案 2 :(得分:1)

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

但是,您可以使用反射API在此对象上获取Method对象和invoke

然而,这很慢。私有类或私有接口会快得多。

答案 3 :(得分:1)

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

你已经做到了;最终的结果是一个匿名的内部类: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;
            }
        }
    }
}

答案 4 :(得分:1)

另一个选择是使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();
}