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

Java 如何访问“未命名”类的方法?,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,这里,我声明一个抽象类DemoAbstractClass。显然,我可以创建一个新类来扩展这个类,并将这个方法添加到这个类中。但是,在我的场景中,我宁愿不这样做。 在上面的代码中,还有其他方法可以访问getVal方法吗???您不能。你需要做一个合适的非匿名类。如果要限制其范围,请将其设置为内部私有类 或者,您可以使用StringBuffer并在方法之间共享对它的引用。但不是非常干净 相关问题: 你不能。你需要做一个合适的非匿名类。如果要限制其范围,请将其设置为内部私有类 或者,您可以使用Strin

这里,我声明一个抽象类DemoAbstractClass。显然,我可以创建一个新类来扩展这个类,并将这个方法添加到这个类中。但是,在我的场景中,我宁愿不这样做。
在上面的代码中,还有其他方法可以访问getVal方法吗???

您不能。你需要做一个合适的非匿名类。如果要限制其范围,请将其设置为内部私有类

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

相关问题:


你不能。你需要做一个合适的非匿名类。如果要限制其范围,请将其设置为内部私有类

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

相关问题:


如果不使用反射,您将无法访问对象的具体类型,无法将methodcall绑定到该对象


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

,除非使用反射,否则您无法访问对象的具体类型以将methodcall绑定到


如果您不想以合理的方式执行类似的操作,请声明一个命名类并将其用作abstractClass的类型。不幸的是,如果您无法命名该类型,则无法在语言级别访问这些方法

不过,您可以使用反射API获取一个方法对象并在该对象上调用它


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

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

不过,您可以使用反射API获取一个方法对象并在该对象上调用它

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

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

你已经这样做了;最终的结果是一个匿名的内部类:新的DemoAbstractClass{…};如果您只是将该声明移动到它自己的类中—您甚至可以将其设置为私有类—您可以访问getVal

根据您上面的示例:

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

根据您上面的示例:

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

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

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成为主方法的成员,并使用匿名内部方法的闭包特性:

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对语言设计者来说是一个糟糕的游戏;另一个疑问。。最好是私有内部类或本地类,如您建议的链接答案中所示。本地类的范围会更窄,所以如果可能的话,可以这样做。私有内部类似乎是问题的最终答案。使用StringBuilder对语言设计者来说将是一个糟糕的游戏;另一个疑问。。你建议的链接答案中给出的私有内部类或本地类更好。本地类的范围会更窄,所以如果可能的话,试试这个答案。我喜欢这个答案,但它更像是一种替代安排。如果匿名对象包含字符串以外的成员怎么办?我从不在匿名类中使用成员/实例变量。我总是使用在类定义之外定义的变量,并依赖闭包来访问它们。只要变量是可变的,它就适用于任何类型的变量。它必须是可变的,因为引用必须是最终的。换句话说,您只能编辑引用变量的值,而不能编辑引用本身,这就是我使用StringBuilder而不是String的原因。我也选择了类似的方法,使用最终列表保存对象数据,但要求我查找更好的方法。我喜欢这个答案,但它更像是一种替代安排。如果匿名对象包含字符串以外的成员怎么办?我从不在匿名类中使用成员/实例变量。我总是使用在类定义之外定义的变量,并依赖闭包来访问它们。只要变量是可变的,它就适用于任何类型的变量。它必须是可变的,因为引用必须是最终的。换句话说,您只能编辑引用变量的值,而不能编辑引用本身,这就是我使用StringBuilder的原因
而不是字符串。我也选择了类似的方法,使用最终列表保存对象数据,但要求我查找更好的方法。同意!!反思在这里将是一种负担。私有类/接口或本地类是这里的完美解决方案。同意!!反思在这里将是一种负担。私有类/接口或本地类是这里的完美解决方案。