| package org.yzh.client.netty; | 
|   | 
| import io.github.yezhihao.netmc.core.annotation.Endpoint; | 
| import io.github.yezhihao.netmc.core.annotation.Mapping; | 
| import io.github.yezhihao.netmc.util.ClassUtils; | 
|   | 
| import java.lang.reflect.Method; | 
| import java.util.HashMap; | 
| import java.util.List; | 
| import java.util.Map; | 
|   | 
| public class HandlerMapping { | 
|   | 
|     private final Map<Integer, Handler> handlerMap = new HashMap<>(55); | 
|   | 
|     public HandlerMapping(String... packageNames) { | 
|         for (String packageName : packageNames) { | 
|             initial(packageName); | 
|         } | 
|     } | 
|   | 
|     private void initial(String packageName) { | 
|         List<Class> handlerClassList = ClassUtils.getClassList(packageName, Endpoint.class); | 
|   | 
|         for (Class handlerClass : handlerClassList) { | 
|             Method[] methods = handlerClass.getDeclaredMethods(); | 
|   | 
|             for (Method method : methods) { | 
|                 if (method.isAnnotationPresent(Mapping.class)) { | 
|                     Mapping annotation = method.getAnnotation(Mapping.class); | 
|                     String desc = annotation.desc(); | 
|                     int[] types = annotation.types(); | 
|                     Handler value = new Handler(newInstance(handlerClass), method, desc); | 
|                     for (int type : types) { | 
|                         handlerMap.put(type, value); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     private Object newInstance(Class handlerClass) { | 
|         try { | 
|             return handlerClass.newInstance(); | 
|         } catch (Exception e) { | 
|             throw new RuntimeException(e); | 
|         } | 
|     } | 
|   | 
|     public Handler getHandler(int messageId) { | 
|         return handlerMap.get(messageId); | 
|     } | 
|   | 
| } |