Bukkit 플러그인 개발 튜토리얼 - 모니터

4711 단어

모니터. - Listener.


학습 목표

  • 감청기의 의미를 이해한다
  • 감청기의 등록을 이해한다
  • @EventHandler 주석의 역할

  • 감청기의 의미를 이해하다


    감청기는 개발자로 하여금 관련 검측 조작을 간소화할 수 있다. 예를 들어 유저 이동, 유저 말하기, 서버 닫기...등, 서버에서 일부 작업을 하면 - BukkitAPI의 org를 터치합니다.bukkit.이벤트 패키지의 내용: org.bukkit.event.player #AsyncPlayer Chat Event(javadoc에 따르면 이 클래스는 유저가 비동기적으로 말할 때의 사건을 처리하는 데 사용된다는 것을 알 수 있습니다)

    모니터 등록 이해


    이벤트를 등록하려면 JavaDoc의 주석이 어떻게 쓰였는지 봐야 돼요.
    org를 엽니다.bukkit.이벤트 아래에서 우리는 주해 EventHandler, 인터페이스 Listener를 볼 수 있다
  • EventHandler는 이벤트 감청기가 되는 방법을 설명하는 데 사용되는 주석 원문: An annotation to mark methods as being eventhandler methods
  • Listener는 모든 이벤트 감청기를 터치하는 인터페이스 원문: Tagging all EventListeners를 위한 간단한 인터페이스입니다

  • 정신이 없어요?차 한잔 마시고 오세요~ 그럼 위의 주석이 있으면 저희가 정보를 얻을 수 있어요.
  • 주해 EventHandler는 하나의 방법을 사건 감청기 방법으로 사용할 수 있다
  • 인터페이스 Listener는 하나의 클래스를 감청기 클래스로 만들 수 있다

  • 그래서 저희가 다음 코드를 쓸 수 있어요.
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.event.Listener;
    import org.bukkit.event.EventHandler;
    
    public final class Tutorial1 extends JavaPlugin implements Listener {
    
        @Override
        public void onEnable() {
            getLogger().info("onEnable has been invoked!");
        }
        
        @EventHandler
        public void onChat(AsyncPlayerChatEvent event) {
          event.getPlayer().sendMessage("chat!");
        }
    
    }
    

    그러면 우리는 코드를 컴파일하고 포장하여plugins 폴더에 넣고 게임에 들어가서 말을 하면 onChat 방법이 실행되지 않은 것을 발견할 수 있습니다. 왜 그런지요?플러그인 관리자라는 Bukkit이 제공하는 플러그인 관리 클래스를 살펴보겠습니다. 방법을 볼 수 있습니다.
    registerEvents(Listener listener, Plugin plugin)는 전송된 감청기 클래스의 모든 이벤트를 등록합니다.
    그러면 저희가 onEnable에 다음 코드를 입력하도록 하겠습니다.
      Bukkit.getPluginManager().registerEvents(this, this);
    

    테스트를 다시 컴파일하면 onChat 방법의 내용이 촉발되는 것을 발견할 수 있다
    전체 코드:
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.event.Listener;
    import org.bukkit.event.EventHandler;
    
    public final class Tutorial1 extends JavaPlugin implements Listener {
    
        @Override
        public void onEnable() {
            getLogger().info("onEnable has been invoked!");
            //  ,  , 
            //   ChatListener
            //   Bukkit.getPluginManager.registerEvents(new ChatListener(), this);
            Bukkit.getPluginManager().registerEvents(this, this);
        }
        
        @EventHandler
        public void onChat(AsyncPlayerChatEvent event) {
          event.getPlayer().sendMessage("chat!");
        }
    
    }
    

    @EventHandler 메모의 역할


    그러면 우리는 이미 감청기의 등록 조작을 배웠다. 그러면 이 EventHandler를 연구해 보자. 우리 먼저register Events () 방법의 구체적인 실현을 보자.
    public void registerEvents(Listener listener, Plugin plugin) {
       ......
      for (Map.Entry, Set> entry : plugin.getPluginLoader().createRegisteredListeners(listener, plugin).entrySet()) {
     getEventListeners(getRegistrationClass((Class)entry.getKey())).registerAll((Collection)entry.getValue());
      }
    }
    

    우리는 get Registration Class () 방법을 보았고, 이 방법이 무엇을 했는지 다시 한 번 봅시다
    public Map, Set> createRegisteredListeners(Listener listener, Plugin plugin) {
        Validate.notNull(plugin, "Plugin can not be null");
        Validate.notNull(listener, "Listener can not be null");
        
        this.server.getPluginManager().useTimings();
        Map, Set> ret = new HashMap();
        Method[] privateMethods;
        try {
          Method[] publicMethods = listener.getClass().getMethods();
          privateMethods = listener.getClass().getDeclaredMethods();
          Set methods = new HashSet(publicMethods.length + privateMethods.length, 1.0F);
          for (Method method : publicMethods) {
            methods.add(method);
          }
          for (Method method : privateMethods) {
            methods.add(method);
          }
        }
        catch (NoClassDefFoundError e) {
          plugin.getLogger().severe("Plugin " + plugin.getDescription().getFullName() + " has failed to register events for " + listener.getClass() + " because " + e.getMessage() + " does not exist.");
          return ret;
        }
        Set methods;
        for (final Method method : methods) {
          EventHandler eh = (EventHandler)method.getAnnotation(EventHandler.class);
           ......
        }
    

    그러면 우리는 위의 코드에서 BukkitAPI가 전송된 Listener 구현 클래스를 검사한 다음에 전송된 Listener 구현 클래스의 모든 방법을 반사한 다음에 필요한 일을 한 후에 이벤트를 등록할 수 있음을 발견할 수 있다
    위의 코드에 근거하여 우리는 다음과 같은 결론을 얻을 수 있다
  • EventHandler는 특정한 방법을 감청기로 표시하는 데 사용된다
  • 좋은 웹페이지 즐겨찾기