Java 如何访问“未命名”类的方法?
这里,我声明一个抽象类DemoAbstractClass。显然,我可以创建一个新类来扩展这个类,并将这个方法添加到这个类中。但是,在我的场景中,我宁愿不这样做。Java 如何访问“未命名”类的方法?,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,这里,我声明一个抽象类DemoAbstractClass。显然,我可以创建一个新类来扩展这个类,并将这个方法添加到这个类中。但是,在我的场景中,我宁愿不这样做。 在上面的代码中,还有其他方法可以访问getVal方法吗???您不能。你需要做一个合适的非匿名类。如果要限制其范围,请将其设置为内部私有类 或者,您可以使用StringBuffer并在方法之间共享对它的引用。但不是非常干净 相关问题: 你不能。你需要做一个合适的非匿名类。如果要限制其范围,请将其设置为内部私有类 或者,您可以使用Strin
在上面的代码中,还有其他方法可以访问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的原因
而不是字符串。我也选择了类似的方法,使用最终列表保存对象数据,但要求我查找更好的方法。同意!!反思在这里将是一种负担。私有类/接口或本地类是这里的完美解决方案。同意!!反思在这里将是一种负担。私有类/接口或本地类是这里的完美解决方案。