使用任意定义的匿名接口方法

Xen*_*ate 21 java

请考虑以下代码:

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()方法获取该类的方法.

好吧,我自己并不是反思的忠实粉丝.更好的方法当然是通过扩展超类来创建一个类,如果你要做这些东西的话.这将是一个痛苦的头脑,使用反射解决方法,通过简单的修改可以轻松完成.


Ale*_*exR 7

好的方法是不要在你的情况下使用匿名内部类,而是定义你自己的类,扩展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并不是一个好的设计.创建其他可以接受文件并在其上执行操作的类.您将获得更好的封装和代码可重用性.

编辑显然你可以使用反射调用你想要的任何方法,但我不能称之为"好的解决方案".我可以称之为"可能的解决方法".

  • +1不推荐反射 (5认同)