从匿名类调用新定义的方法

2022-09-02 00:13:32

我实例化了一个匿名类的对象,我向其中添加了一个新方法。

Date date = new Date() {
    public void someMethod() {}
}

我想知道是否有可能从外部调用此方法,类似于:

date.someMethod();

答案 1

问得好。答案是否定的。你不能直接打电话
让我们先了解这是什么。date.someMethod();

Date date = new Date()  { ... }; 

上面是匿名(没有名称)子类,它正在扩展日期类。

当您看到这样的代码时,

    Runnable r = new Runnable() {

        public void run() {

        }

    };

这意味着你已经定义了匿名(没有名称)类,它正在实现(而不是扩展)Runnable接口。

因此,当您调用它时,它将无法调用,因为在上面的情况下超类是类中没有定义。它遵循简单的覆盖规则。date.someMethod()someMethodsuperclass.Date

但是,如果您想调用一些Method,那么以下就是步骤。

第一种方式>
引用变量 'date'
date.getClass().getMethod("someMethod").invoke(date);

第二种方法>
使用新创建的 Date 类对象的匿名子类。

new Date() 
{
    public void someMethod() {
          System.out.println("Hello");
    }
}.someMethod();   //this should be without reference 'date'

答案 2

基本上没有。

然而,这种丑陋可以做到...

Date date = new Date() {
  public Date someMethod() { 
     //do some stuff here
     return this;
  }
}.someMethod();

但除此之外,您只能使用反射来调用该方法(在父类中不存在),如下所示:

date.getClass().getMethod("someMethod").invoke(date);

(为了清楚起见,尝试捕获省略...)

但说真的,不要这样做!我会觉得被编写此代码的人所憎恨,如果我在我必须处理的代码库中偶然发现了这一点。


推荐