jdk动态代理实现

来源:互联网 发布:网络中级工程师好考吗 编辑:程序博客网 时间:2024/05/17 03:07

1.接口定义

package com.henry.service;public interface HelloService {void sayHello();        int sum(int i ,int j); }

2.接口实现

package com.henry.service.impl;import com.henry.service.HelloService;public class HelloServiceImpl implements HelloService {public void sayHello() {System.out.println("hello henry");}               public int sum(int i, int j) {        // TODO Auto-generated method stub        return i+j;      } }

3.代理类

package com.henry.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyProxy implements InvocationHandler {private Object originalObj;public Object bind(Object originalObj){this.originalObj=originalObj;return Proxy.newProxyInstance(this.originalObj.getClass().getClassLoader(), this.originalObj.getClass().getInterfaces(), this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("proxy class exec");                return method.invoke(this.originalObj, args);}}

4.测试

package com.henry.proxy;import com.henry.service.HelloService;import com.henry.service.impl.HelloServiceImpl;public class TestProxy {public static void main(String[] args) {HelloService service = (HelloService) new MyProxy().bind(new HelloServiceImpl());service.sayHello();}}

5.结果

proxy class exechello henry

6.本地生成代理类文件

package com.henry.proxy;import com.henry.service.HelloService;import com.henry.service.impl.HelloServiceImpl;public class TestProxy {public static void main(String[] args) {                //生成代理类$Proxy0.class                System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");HelloService service = (HelloService) new MyProxy().bind(new HelloServiceImpl());service.sayHello();}}

7.反编译$Proxy0.class

import com.henry.service.HelloService;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.lang.reflect.UndeclaredThrowableException;public final class $Proxy0 extends Proxy  implements HelloService{  private static Method m3;  private static Method m1;  private static Method m0;  private static Method m4;  private static Method m2;  public $Proxy0(InvocationHandler paramInvocationHandler)    throws   {    super(paramInvocationHandler);  }  public final void sayHello()    throws   {    try    {      this.h.invoke(this, m3, null);      return;    }    catch (Error|RuntimeException localError)    {      throw localError;    }    catch (Throwable localThrowable)    {      throw new UndeclaredThrowableException(localThrowable);    }  }  public final boolean equals(Object paramObject)    throws   {    try    {      return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();    }    catch (Error|RuntimeException localError)    {      throw localError;    }    catch (Throwable localThrowable)    {      throw new UndeclaredThrowableException(localThrowable);    }  }  public final int hashCode()    throws   {    try    {      return ((Integer)this.h.invoke(this, m0, null)).intValue();    }    catch (Error|RuntimeException localError)    {      throw localError;    }    catch (Throwable localThrowable)    {      throw new UndeclaredThrowableException(localThrowable);    }  }  public final int sum(int paramInt1, int paramInt2)    throws   {    try    {      return ((Integer)this.h.invoke(this, m4, new Object[] { Integer.valueOf(paramInt1), Integer.valueOf(paramInt2) })).intValue();    }    catch (Error|RuntimeException localError)    {      throw localError;    }    catch (Throwable localThrowable)    {      throw new UndeclaredThrowableException(localThrowable);    }  }  public final String toString()    throws   {    try    {      return (String)this.h.invoke(this, m2, null);    }    catch (Error|RuntimeException localError)    {      throw localError;    }    catch (Throwable localThrowable)    {      throw new UndeclaredThrowableException(localThrowable);    }  }  static  {    try    {      m3 = Class.forName("com.henry.service.HelloService").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]);      m4 = Class.forName("com.henry.service.HelloService").getMethod("sum", new Class[] { Integer.TYPE, Integer.TYPE });      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());    }  }}





0 0