1
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方法?

4

5 回答 5

6

你不能。您需要从中创建一个适当的(非异常)类。如果您想限制其范围,请将其设为内部私有类。

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

相关问题:

于 2012-06-14T15:44:11.953 回答
1

如果不使用反射,则不能,因为您无法访问对象的具体类型才能将方法调用绑定到

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

于 2012-06-14T15:44:43.937 回答
1

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

但是,您可以做的是使用反射 API 来获取一个Method对象并将invoke其放在该对象上。

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

于 2012-06-14T15:45:15.457 回答
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;
            }
        }
    }
}
于 2012-06-14T15:48:37.613 回答
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();
}
于 2012-06-14T15:52:13.667 回答