package foundation.route; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import foundation.handler.BaseHandler; import foundation.handler.IHandler; import foundation.handler.SingletonHandler; import foundation.json.IJSONWriter; public class ControllerRoute extends Route { private Class toClass; private Class instanceObjectClass; private Class singletonObjectClass; private Method getSingletonInstanceMethod; public ControllerRoute(String from, String className) throws Exception { super(RouteBrowseCode.Handler, from); routeType = RouteType.Controller; remark = from + " --> " + className; setCallableClassName(className); } @SuppressWarnings({ "rawtypes", "unchecked" }) public void setCallableClassName(String classname) throws Exception { //1. Class clazz = Class.forName(classname); if (SingletonHandler.class.isAssignableFrom(clazz)) { //1.2. 如果是只能单例的HttpObject singletonObjectClass = (Class) clazz; getSingletonInstanceMethod = clazz.getDeclaredMethod("getInstance"); } else if (BaseHandler.class.isAssignableFrom(clazz)) { //1.1. 如果是可以多实例化的HttpObject instanceObjectClass = (Class) clazz; } else { throw new Exception("error callable class: " + clazz); } } public IHandler getToObject() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (instanceObjectClass != null) { return instanceObjectClass.newInstance(); } if (singletonObjectClass != null) { return (IHandler) getSingletonInstanceMethod.invoke(null); } return null; } public Class getToClass() { return toClass; } @Override public void onWriteJSON(IJSONWriter writer) { //1. write from writer.write("from", from); // write to Class clazz = toClass; if (clazz == null) { clazz = instanceObjectClass; } if (clazz == null) { clazz = singletonObjectClass; } if (clazz == null) { writer.writeNull("to"); return; } writer.write("to", clazz.getName()); } @Override protected String formateFrom(String from) { from = from.toLowerCase(); return from; } @Override public String toString() { return remark; } }