其实网上有很多关于java动态代理的实现博客,自己实现了一下,给自己备忘。
以下的DynamicProxyTest类是用于测试和生成java的动态代理类。 import sun.misc.ProxyGenerator; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Created by */ public class DynamicProxyTest { private interface TestMethod { void test(); } private static class TestMethodImp implements TestMethod { @Override public void test() { System.out.println("TestMethodImp"); } } private static class TestMethodHandler implements InvocationHandler { private TestMethod testMethod; public TestMethodHandler(TestMethod testMethod) { this.testMethod = testMethod; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("start"); method.invoke(testMethod, args); System.out.println("end"); return null; } } public static void main(String[] args) { TestMethod testMethod = new TestMethodImp(); TestMethodHandler testMethodHandler = new TestMethodHandler(testMethod); TestMethod proxyObj = (TestMethod) Proxy.newProxyInstance(testMethod.getClass().getClassLoader(), testMethod.getClass().getInterfaces(), testMethodHandler); proxyObj.test();//用来测试动态代理 try { //这里是生成内存中的代理类 FileOutputStream outputStream = new FileOutputStream("./TestMethodProxy.class"); System.out.println(proxyObj.getClass().getName()); outputStream.write(ProxyGenerator.generateProxyClass(proxyObj.getClass().getName(), proxyObj.getClass().getInterfaces())); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
这里是DynamicProxyTest生成的动态代理类:$Proxy0import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; import me.knowledge.baseknownledge.DynamicProxyTest.TestMethod; public final class $Proxy0 extends Proxy implements TestMethod { private static Method m1; private static Method m3; private static Method m0; private static Method m2; public $Proxy0(InvocationHandler var1) throws { super(var1); } public final boolean equals(Object var1) throws { try { return ((Boolean)super.h.invoke(this, m1, new Object[]{var1})).booleanValue(); } catch (RuntimeException | Error var3) { throw var3; } catch (Throwable var4) { throw new UndeclaredThrowableException(var4); } } public final void test() throws { try { super.h.invoke(this, m3, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } public final int hashCode() throws { try { return ((Integer)super.h.invoke(this, m0, (Object[])null)).intValue(); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } public final String toString() throws { try { return (String)super.h.invoke(this, m2, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } static { try { m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[]{Class.forName("java.lang.Object")}); m3 = Class.forName("me.knowledge.baseknownledge.DynamicProxyTest$TestMethod").getMethod("test", new Class[0]); m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); } catch (NoSuchMethodException var2) { throw new NoSuchMethodError(var2.getMessage()); } catch (ClassNotFoundException var3) { throw new NoClassDefFoundError(var3.getMessage()); } } }其中代理类的test方法调用的是 TestMethodHandler的invoke方法,方法的获得由m3 = Class.forName("me.knowledge.baseknownledge.DynamicProxyTest$TestMethod").getMethod("test", new Class[0]);给出。