动态代理和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
原创粉丝点击