package org.apache.cxf.common.util; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; /** * */ class CglibProxyHelper extends ProxyHelper { CglibProxyHelper() throws Exception { Class.forName("net.sf.cglib.proxy.Enhancer"); Class.forName("net.sf.cglib.proxy.MethodInterceptor"); Class.forName("net.sf.cglib.proxy.MethodProxy"); } @Override protected Object getProxyInternal(ClassLoader loader, Class<?>[] interfaces, final java.lang.reflect.InvocationHandler h) { Class<?> superClass = null; List<Class<?>> theInterfaces = new ArrayList<Class<?>>(); for (Class<?> c : interfaces) { if (!c.isInterface()) { if (superClass != null) { throw new IllegalArgumentException("Only a single superclass is supported"); } superClass = c; } else { theInterfaces.add(c); } } if (superClass != null) { Enhancer enhancer = new Enhancer(); enhancer.setClassLoader(loader); enhancer.setSuperclass(superClass); enhancer.setInterfaces(theInterfaces.toArray(new Class[]{})); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { return h.invoke(obj, method, args); } }); return enhancer.create(); } else { return super.getProxyInternal(loader, interfaces, h); } } }
package org.apache.cxf.common.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * */ public class ProxyHelper { static final ProxyHelper HELPER; static { ProxyHelper theHelper = null; try { theHelper = new CglibProxyHelper(); } catch (Throwable ex) { theHelper = new ProxyHelper(); } HELPER = theHelper; } protected ProxyHelper() { } protected Object getProxyInternal(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) { return Proxy.newProxyInstance(loader, interfaces, handler); } public static Object getProxy(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) { return HELPER.getProxyInternal(loader, interfaces, handler); } }
相关推荐
Java中的动态代理给我们提供一种动态生成类的方式,有很好的灵活性,这种技术一般会出现在一些第三方框架中,来降低接入方的使用成本。
cglib3.1 和 cglib-nodep3.1 jar的压缩包,cglib-nodep包含是整合asmjar包的。
CglibProxy.java
NULL 博文链接:https://chenhongwei0924.iteye.com/blog/845769
使用JDK中的Proxy技术实现AOP 使用CGLib实现AOP功能
proxy,jdkproxy-transaction,jdkproxy-salary,day02-itheima11-spring-08-cglibproxy,day02-itheima11-spring-09-aop.xml,day02-itheima11-spring-10-aop.xml.advice,day02-itheima11-spring-11-aop.xml.exception等...
Spring休息祈求者Spring调用程序将远程JSON REST服务绑定到Java接口, 工作方式。... 接口和远程服务之间的具体映射可以通过编程或通过使用Spring或JAX-RS注释对接口进行注释来完成。... #26 CglibProxy