从匿名类调用新定义的方法
2022-09-02 00:13:32
我实例化了一个匿名类的对象,我向其中添加了一个新方法。
Date date = new Date() {
public void someMethod() {}
}
我想知道是否有可能从外部调用此方法,类似于:
date.someMethod();
我实例化了一个匿名类的对象,我向其中添加了一个新方法。
Date date = new Date() {
public void someMethod() {}
}
我想知道是否有可能从外部调用此方法,类似于:
date.someMethod();
问得好。答案是否定的。你不能直接打电话
让我们先了解这是什么。date.someMethod();
Date date = new Date() { ... };
上面是匿名(没有名称)子类,它正在扩展日期类。
当您看到这样的代码时,
Runnable r = new Runnable() {
public void run() {
}
};
这意味着你已经定义了匿名(没有名称)类,它正在实现(而不是扩展)Runnable接口。
因此,当您调用它时,它将无法调用,因为在上面的情况下,超类是类中没有定义。它遵循简单的覆盖规则。date.someMethod()
someMethod
superclass.
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'
基本上没有。
然而,这种丑陋可以做到...
Date date = new Date() {
public Date someMethod() {
//do some stuff here
return this;
}
}.someMethod();
但除此之外,您只能使用反射来调用该方法(在父类中不存在),如下所示:
date.getClass().getMethod("someMethod").invoke(date);
(为了清楚起见,尝试捕获省略...)
但说真的,不要这样做!我会觉得被编写此代码的人所憎恨,如果我在我必须处理的代码库中偶然发现了这一点。