Java匿名类重写时新增变量不修改父类如何实现外部访问
问题核心原因
Java采用静态类型检查机制,你将匿名子类的实例赋值给了声明为Foo类型的变量,编译期只会校验声明类型Foo的成员定义,匿名子类新增的test变量不属于Foo的成员,因此无法直接通过Foo类型的变量访问。
无需修改父类的可行解决方案
方案1:使用var自动推导类型(Java 10及以上版本支持)
如果在声明匿名类实例时用var代替显式的Foo类型声明,编译器会自动推导为匿名子类的实际类型,就可以直接访问新增的成员:
public class Main { public static void main(String[] args) { // 用var推导匿名子类类型,不要显式声明为Foo var foo = new Foo() { public String test = "test"; @Override public void foo() { super.foo(); test = test + test; System.out.println(test); } }; // 可正常访问 System.out.println(foo.test); for (int i = 0; i < 3; i++) { foo.foo(); } } }
方案2:通过反射访问
如果Java版本低于10,或者必须使用Foo类型声明变量,可以通过反射在运行时获取匿名子类的成员:
// 运行时获取匿名类的test字段 Field testField = foo.getClass().getField("test"); // 读取实例对应的test值 String testValue = (String) testField.get(foo); System.out.println(testValue); // 也可直接修改值 testField.set(foo, "newValue");
如果test被声明为非public访问权限,需要在调用get/set前添加testField.setAccessible(true)关闭访问权限检查。
内容的提问来源于stack exchange,提问作者OldLavyGenes474
相关产品推荐
相关产品推荐

