package com.jiuqi.mobile.nigo.comeclose.portal; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * 门户工厂(仅提供给门户网站使用,使用时。 * 请确认对于的Manager接口以标注PortalAnnotation标签 * 请确认您使用的方法已经标注PortalMethodAnnotation标签 * @author modi * */ public class PortalManagerFactory { @SuppressWarnings("unchecked") public static <T> T instanceManager(Class<T> c){ if(c.isInterface()){ return instantceInterface(c); } return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), c.getInterfaces(), instanceInvocation(c)); } private synchronized static <T> InvocationHandler instanceInvocation(Class<T> c) { try { Class<?> inv = Class.forName("com.jiuqi.mobile.nigo.biz.core.portal.PortalInvocationHandler", true, Thread.currentThread().getContextClassLoader()); return (InvocationHandler) inv.getConstructors()[0].newInstance(c); } catch (Exception e) { throw new RuntimeException("实例化Manager时,invocation构建失败",e); } } // private static InvocationHandler instanceManagerInvocation(Class<?> managerClass){ // return instanceInvocation(managerClass); // } @SuppressWarnings("unchecked") private static <T> T instantceInterface(Class<T> c){ PortalAnnotation ma = c.getAnnotation(PortalAnnotation.class); if(null == ma){ throw new RuntimeException("Manager未使用PortalAnnotation标签"); } try { Class<?> impl = Class.forName(ma.implClass(), true, Thread.currentThread().getContextClassLoader()); return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[]{c}, instanceInvocation(impl)); } catch (ClassNotFoundException e) { throw new RuntimeException("Manager实例化失败",e); } } }