学习完JDK的动态代理、静态代理、cglib代理后,其实现原理就是通过在JVM中通过字节码重组从而创建了一个代理对象。
那我试着手动去自己实现这一过程。
1.分析JDK动态代理
通过JDK动态代理可以生成一个代理类,输出这个代理类我们可以看到这是一个从来没有定义的类
User userproxy=(User)new UserProxy().getInstance(new UserImpl()); System.out.println(userproxy.getClass());
这个类我们是无法找到的 因为JDK生成完成代理类后删除了该类
1.1 通过分析我们可以知道动态代理有以下这几个过程:
1、拿到被代理对象的引用,并且获取到它的所有的接口,反射获取 2、JDK Proxy类重新生成一个新的类、同时新的类要实现被代理类所有实现的所有的接口 3、动态生成Java代码,把新加的业务逻辑方法由一定的逻辑代码去调用(在代码中体现) 4、编译新生成的Java代码.class 5、再重新加载到JVM中运行
2.实现过程
2.1 建立一个接口类 User 和实现类 UserImpl
public interface User { public void add(); public void update(); }
public class UserImpl implements User { @Override public void add() { System.out.println("新增用户"); } @Override public void update() { System.out.println("修改用户"); } }
2.2 建立自己的InvocationHandler
public interface GPInvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
2.3 因为在生成代理类中需要把class文件加载到JVM中去,所以我们需要去实现自己的ClassLoader
public class GPClassLoader extends ClassLoader { private File classPathFile; public GPClassLoader(){ String classPath = GPClassLoader.class.getResource("").getPath(); //<