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 方法?
答案 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();
}