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

时间:2013-03-20 15:16:33

标签: java anonymous-class anonymous-methods

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

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

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

date.someMethod();

6 个答案:

答案 0 :(得分:26)

好问题。答案是否定的。您无法直接致电date.someMethod();
让我们先了解这是什么。

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

上面是匿名(没有名字)子类,它正在扩展Date类。

当您看到类似的代码时,

    Runnable r = new Runnable() {

        public void run() {

        }

    };

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

因此,当您致电date.someMethod()时, 无法能够致电,因为someMethod <{1}}上面的案例超类是superclass.类。它遵循简单的首要规则。

但是,如果您想拨打Date,请按照以下步骤操作。

Fisrt way&gt;
使用引用变量“someMethod
date

第二种方式&gt;
使用新创建的Date类的匿名子类。

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

答案 1 :(得分:9)

基本上没有。

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

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

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

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

(为了清楚起见,试试留下了......)

但严重的是,不要这样做!我觉得被编写此代码的人所厌恶,如果我在代码库中偶然发现这个问题,我必须继续工作。

答案 2 :(得分:8)

不使用反射你不能:该方法不是Date API的一部分,date只是编译器所关注的日期。

您可以使用someMethod的唯一方法是直接在新创建的实例上调用它:

new Date() { public void someMethod() { } }.someMethod();

答案 3 :(得分:2)

不,这就是本地类的方法。

 class MyDate extends Date() {
   public void someMethod() {...}
 }
 MyDate date = new MyDate();
 date.someMethod();

答案 4 :(得分:2)

在Java 10+中,使用var关键字

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

date.someMethod();

答案 5 :(得分:1)

我不知道你为什么会这样做,但是由于Date没有声明someMethod,所以不可能这样做。

但是,您可以在方法中声明一个本地类,例如:

void foo ( )
{
  class MyDate extends Date
  {
     public void someMethod( );
  }

  MyDate date = new MyDate( );

  date.someMethod( );
}

我再次建议首先使用normal课程,因为本地课程的性质无法进行测试。