为了账号安全,请及时绑定邮箱和手机立即绑定

自定义 EventListener 检查类覆盖的抽象方法

自定义 EventListener 检查类覆盖的抽象方法

慕桂英4014372 2022-07-27 09:38:32
你好,所以我得到了以下代码:事件处理程序.javapackage me.xenopyax.edla.watcher;import static java.nio.file.StandardWatchEventKinds.*;import java.io.IOException;import java.nio.file.FileSystem;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.WatchEvent;import java.nio.file.WatchEvent.Kind;import java.util.ArrayList;import java.util.List;import java.nio.file.WatchKey;import java.nio.file.WatchService;public class EventHandler {private Path folderPath = Paths.get(System.getProperty("user.dir") + "/Saved Games/Frontier Developments/Elite Dangerous");private String watchFile;private List<EventListener> listeners = new ArrayList<>();  public EventHandler()  {    // We obtain the file system of the Path    FileSystem fileSystem = folderPath.getFileSystem();    // We create the new WatchService using the try-with-resources block    try (WatchService service = fileSystem.newWatchService()) {        // We watch for modification events        folderPath.register(service, ENTRY_MODIFY);        // Start the infinite polling loop        while (true) {            // Wait for the next event            WatchKey watchKey = service.take();            for (WatchEvent<?> watchEvent : watchKey.pollEvents()) {                // Get the type of the event                Kind<?> kind = watchEvent.kind();                if (kind == ENTRY_MODIFY) {                    Path watchEventPath = (Path) watchEvent.context();                    // Call this if the right file is involved                    if (watchEventPath.toString().equals(watchFile)) {                        //File has been modified, call event registered                    }                }            }            if (!watchKey.reset()) {                // Exit if no longer valid                break;            }        }现在我的问题是如何从EventHandler.java中的EventListener.java调用抽象方法以及如何在ArrayList中检查哪些方法被覆盖?我正在尝试创建一个监听文件的 EventHandler,当发生更改时,它会查找更改的内容并从EventListener.java触发适当的抽象方法。
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

如果它不是您的抽象类,则可以检查方法的声明类,然后该方法被覆盖。


import sun.reflect.generics.reflectiveObjects.NotImplementedException;


import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.List;


class Main {

    static abstract class EventListener {

        public void onFileChanged() {

            throw new NotImplementedException();

        }

    }


    static class EventListenerNotImpl extends EventListener {


    }


    static class EventListenerImpl extends EventListener {

        private String id;


        public EventListenerImpl(String id) {

            this.id = id;

        }


        public void onFileChanged() {

            System.out.println(id + ":" + EventListenerImpl.class.getCanonicalName() + ".onFileChanged() was called");

        }

    }


    static class EventHandler {

        private List<EventListener> listeners = new ArrayList<>();


        public void addListener(EventListener listener) {

            listeners.add(listener);

        }


        private void propagateOnFileChangedEvent() {

            listeners.forEach(l -> {

                try {

                    Method m = l.getClass().getMethod("onFileChanged");

                    if (!m.getDeclaringClass().equals(EventListener.class)) {

                        l.onFileChanged();

                    }

                } catch (NoSuchMethodException e) {

                    e.printStackTrace();

                }

            });

        }

    }


    public static void main(String[] args) {

        EventHandler handler = new EventHandler();


        handler.addListener(new EventListenerImpl("listener-1"));

        handler.addListener(new EventListenerNotImpl()); // Not will be invoked onFileChangedEvent

        handler.addListener(new EventListenerImpl("listener-3"));


        handler.propagateOnFileChangedEvent();

    }

}

输出:


listener-1:Main.EventListenerImpl.onFileChanged() was called

listener-3:Main.EventListenerImpl.onFileChanged() was called


查看完整回答
反对 回复 2022-07-27
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信