首页 > 解决方案 > 具有定义的匿名类实例化 - 覆盖受保护的方法

问题描述

假设我有课:

class A {
    protected int x; // no public getter, setter
}

现在我想扩展A类,覆盖'x'变量。答案是:

public class SomeClass {
    someMethod() {
        A extendedClass = new MyExtension(5);
    }

    class MyExtension extends A {
        public MyExtension(int x) {
            super.x = x;
        }
    }
}

我的问题是:有没有可能在不单独定义嵌套类的情况下做到这一点?我的意思是这样的

    someMethod() {
        A extendedClass = new A() {
            // here do something like super.x = 5;
        }
    }

我尝试从匿名类调用新定义的方法,但它不会让我实例化 A 类。我也不想使用反射。

我不想定义嵌套类只是为了覆盖一个属性。问题的根源是 Spring-integration ImapMailReceiver,我想在其中覆盖任务调度程序。如下所示:

    final ImapMailReceiver imapMailReceiver = new ImapMailReceiver() {
           super.setTaskScheduler(MYTASKSCHEDULERHERE);
    }

标签: javanestedabstractprotectedanonymous

解决方案


new A() { ... }仍然只是定义一个新类。因此,您不能简单地将任何语句放在大括号之间,只有字段、方法和嵌套类型声明可以放在那里,但不允许使用构造函数。您可以添加一个实例初始化器:

A extendedClass = new A() {
  {
    x = 5;
  }
}

推荐阅读