请考虑以下代码:
public static void main(String[] args) {
File file = new File("C:\\someFile.txt") {
public void doStuff() {
// Do some stuff
}
};
file.doStuff(); // "Cannot resolve method"
}
Run Code Online (Sandbox Code Playgroud)
当我们尝试调用新定义的方法时doStuff()
,这是不可能的.原因是它file
被声明为类型的对象File
而不是我们新的匿名子类的实例.
所以,我的问题是,有没有"好的"方法来实现这种行为?除了显而易见的(只是,正确地宣布类).
Roh*_*ain 16
这是不可能的,因为你试图在超类引用上调用方法子类.并且该方法没有在超类本身中定义.匿名类只是File
那里的子类.
但是,解决方法是进行反思:
file.getClass().getMethod("doStuff").invoke(file);
Run Code Online (Sandbox Code Playgroud)
该getClass()
方法将返回运行时类型file
,然后您可以使用Class#getMethod()
方法获取该类的方法.
好吧,我自己并不是反思的忠实粉丝.更好的方法当然是通过扩展超类来创建一个类,如果你要做这些东西的话.这将是一个痛苦的头脑,使用反射解决方法,通过简单的修改可以轻松完成.
好的方法是不要在你的情况下使用匿名内部类,而是定义你自己的类,扩展File
并添加你需要的任何方法.
class StuffedFile extends File {
// implement all needed constructors
public void doStuff() { /*.....*/}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以使用它如下:
MyFile f = new MyFile("...");
f.doStuff();
Run Code Online (Sandbox Code Playgroud)
然而,整个这种扩展尝试File
并不是一个好的设计.创建其他可以接受文件并在其上执行操作的类.您将获得更好的封装和代码可重用性.
编辑显然你可以使用反射调用你想要的任何方法,但我不能称之为"好的解决方案".我可以称之为"可能的解决方法".