具有定义的匿名类实例化-覆盖受保护的方法

时间:2018-08-17 10:29:10

标签: java nested abstract protected anonymous

假设我有课:

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;
        }
    }

我尝试使用Calling newly defined method from anonymous class,但是它不允许我实例化A类。我也不想使用反射。

我简单,不想定义嵌套类只是为了覆盖一个属性。问题的根源是Spring集成ImapMailReceiver,我想在其中覆盖任务计划程序。如下所示:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

为什么要使用嵌套或匿名内部类? 我们可以进行覆盖并按如下所示访问覆盖的变量。

public class SomeClass extends A{
    int val;
    void someMethod(int val) {
        super.x = val;
    }

    public static void main(String[] args) {
        SomeClass sc = new SomeClass();
        System.out.println(sc.x);  // output=10
        sc.someMethod(20);
        System.out.println(sc.x);  // output=20
    }

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