动态代理和cglib实现
来源:互联网 发布:上海威纳数据 编辑:程序博客网 时间:2024/05/23 05:08
jdk动态代理:
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JdkHanler implements InvocationHandler { private Object target; public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable { System.out.println("before"); Object o=method.invoke(target, arg); System.out.println("after"); return o; } public JdkHanler(Object target) { super(); this.target = target; } public Object getInstance(){ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); }}
cglib动态代理:
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class HelloWorldInterceptor implements MethodInterceptor { private Object target; public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("before"); Object r=proxy.invokeSuper(obj, args); System.out.println("after"); return r; } public HelloWorldInterceptor(Object target) { super(); this.target = target; } public Object getInstance(){ Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return enhancer.create(); }}
测试类:
public class AllTest { public static final String output="D:/SpringWorkSpace/"; //cglib生成代理类字节码文件 static{ System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, output); } @Test public void proxyTest(){ HelloWorldInterceptor interceptor=new HelloWorldInterceptor(new HelloWorldImpl()); HelloWorld h=(HelloWorld) interceptor.getInstance(); h.sayHello(); } //@Test public void jdkproxyTest() throws IOException{ JdkHanler hanler=new JdkHanler(new HelloWorldImpl()); HelloWorld h=(HelloWorld) hanler.getInstance(); h.sayHello(); jdkToFile(h); }//jdk代理类字节码文件 public static void jdkToFile(HelloWorld obj) throws IOException { Class clazz = obj.getClass(); String className = clazz.getName(); byte[] classFile = ProxyGenerator.generateProxyClass(className, HelloWorldImpl.class.getInterfaces()); FileOutputStream fos = new FileOutputStream(output+"proxy.class"); fos.write(classFile); }}
利用jd-gui工具反编译字节码文件:
生成的jdk代理类:
public final class $Proxy4 extends Proxy implements HelloWorld{ private static Method m3; private static Method m1; private static Method m0; private static Method m2; public $Proxy4(InvocationHandler paramInvocationHandler) throws { super(paramInvocationHandler); } //调用sayHello方法 public final String sayHello() throws { try { //调用JdkHanler的invoke方法 return (String)this.h.invoke(this, m3, null); } catch (Error|RuntimeException localError) { throw localError; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } static { try { m3 = Class.forName("com.selrain.DynamicProxy.HelloWorld").getMethod("sayHello", new Class[0]); m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") }); m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); return; } catch (NoSuchMethodException localNoSuchMethodException) { throw new NoSuchMethodError(localNoSuchMethodException.getMessage()); } catch (ClassNotFoundException localClassNotFoundException) { throw new NoClassDefFoundError(localClassNotFoundException.getMessage()); } }
生成的cglib代理类:
public class HelloWorld$$EnhancerByCGLIB$$d87b5f2a extends HelloWorld implements Factory{ private boolean CGLIB$BOUND; public static Object CGLIB$FACTORY_DATA; private static final ThreadLocal CGLIB$THREAD_CALLBACKS; private static final Callback[] CGLIB$STATIC_CALLBACKS; private MethodInterceptor CGLIB$CALLBACK_0; private static Object CGLIB$CALLBACK_FILTER; private static final Method CGLIB$sayHello$0$Method; private static final MethodProxy CGLIB$sayHello$0$Proxy; private static final Object[] CGLIB$emptyArgs; private static final Method CGLIB$hashCode$1$Method; private static final MethodProxy CGLIB$hashCode$1$Proxy; private static final Method CGLIB$clone$2$Method; private static final MethodProxy CGLIB$clone$2$Proxy; private static final Method CGLIB$equals$3$Method; private static final MethodProxy CGLIB$equals$3$Proxy; private static final Method CGLIB$toString$4$Method; private static final MethodProxy CGLIB$toString$4$Proxy; static void CGLIB$STATICHOOK1() { CGLIB$THREAD_CALLBACKS = new ThreadLocal(); CGLIB$emptyArgs = new Object[0]; Class localClass1 = Class.forName("com.selrain.DynamicProxy.HelloWorld$$EnhancerByCGLIB$$d87b5f2a"); Class localClass2; Method[] tmp50_47 = ReflectUtils.findMethods(new String[] { "sayHello", "()Ljava/lang/String;" }, (localClass2 = Class.forName("com.selrain.DynamicProxy.HelloWorld")).getDeclaredMethods()); CGLIB$sayHello$0$Method = tmp50_47[0]; CGLIB$sayHello$0$Proxy = MethodProxy.create(localClass2, localClass1, "()Ljava/lang/String;", "sayHello", "CGLIB$sayHello$0"); tmp50_47; Method[] tmp131_128 = ReflectUtils.findMethods(new String[] { "hashCode", "()I", "clone", "()Ljava/lang/Object;", "equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;" }, (localClass2 = Class.forName("java.lang.Object")).getDeclaredMethods()); CGLIB$hashCode$1$Method = tmp131_128[0]; CGLIB$hashCode$1$Proxy = MethodProxy.create(localClass2, localClass1, "()I", "hashCode", "CGLIB$hashCode$1"); Method[] tmp151_131 = tmp131_128; CGLIB$clone$2$Method = tmp151_131[1]; CGLIB$clone$2$Proxy = MethodProxy.create(localClass2, localClass1, "()Ljava/lang/Object;", "clone", "CGLIB$clone$2"); Method[] tmp171_151 = tmp151_131; CGLIB$equals$3$Method = tmp171_151[2]; CGLIB$equals$3$Proxy = MethodProxy.create(localClass2, localClass1, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$3"); Method[] tmp191_171 = tmp171_151; CGLIB$toString$4$Method = tmp191_171[3]; CGLIB$toString$4$Proxy = MethodProxy.create(localClass2, localClass1, "()Ljava/lang/String;", "toString", "CGLIB$toString$4"); tmp191_171; } final String CGLIB$sayHello$0() { return super.sayHello(); } //调用sayHello方法 public final String sayHello() { MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0; if (tmp4_1 == null) { tmp4_1;
0 0
- 动态代理和cglib实现
- JDK动态动态代理和cglib动态代理的实现
- 使用JDK和CGLIB实现动态代理
- 动态代理-JDK和Cglib实现
- 使用jdk和cglib实现动态代理
- CGLIB实现动态代理
- CGLIB实现动态代理
- cglib实现动态代理
- CGLib实现动态代理
- cglib 实现动态代理
- cglib动态代理实现
- 实现JDK动态代理和cglib动态代理
- AOP实现--JDK中的动态代理和cglib代理
- hibernate代理实现懒加载+cglib和jdk动态代理
- Cglib实现动态代理原理
- Cglib实现动态代理原理
- cglib动态代理实现原理
- cglib 动态代理实现AOP
- C语言基础知识之五
- 安卓模拟器如何连接adb
- 猜数字的小游戏
- DateFormat 总结
- MySQL学习
- 动态代理和cglib实现
- 170506 解密-ssctf签到wp 汇编-数据标号
- LeetCode:Excel Sheet Column Title
- C++链表:极简版的单向链表类
- Codeforces Round #383 (Div. 2) Arpa’s obvious problem and Mehrdad’s terrible solution 数学
- 交换机、集线器、路由器的区别和使用
- 从记事本上添加手机联系人
- Retrofit的基本使用(Get请求)
- Java中遇到的报错信息为:空指针异常的情况