package com.jiuqi.lbsinterface.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);
}
}
}