You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:39:01