[英]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.