java反射中的Proxy类的方法getProxyClass中的一个参数,我们可以看到源码如下
package java.lang.reflect; public interface InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
该方法中的参数proxy是生成的代理类对象,method是被代理类的某个方法,args是在该method中的参数。业务增强就是在这里
一个次动态代理的组成,一个接口,一个实现类,一个动态代理类。这个动态代理类是生成的,并且该类继承了Proxy并实现了接口。因为已经继承了Proxy所以被代理类一定需要一个接口,而不能是个抽象类。这个接口存在是为了提供给动态生成的代理类,需要实现哪些方法,方法的修饰符和参数类型都是什么。
一个完整的例子如下。
package com.easyjdbc.proxyobtain; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Dao { void save(String name); void put(); } class DaoImpl implements Dao { @Override public void save(String name) { System.out.println("save..."+name); } @Override public void put() { System.out.println("put"); } } public class DynamicProxyTest { public static void main(String[] args) throws Exception { Object target = new DaoImpl(); Class<?> proxyClass = Proxy.getProxyClass(DaoImpl.class.getClassLoader(), DaoImpl.class.getInterfaces()); InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("before..."); result = method.invoke(target, args); System.out.println("after..."); return result; } }; Dao userDao = (Dao) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler); userDao.save("123"); } }
其中最为重要的方法就是public static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) throws IllegalArgumentException。可以进去看到于源码有安全检查和数据

接着点进入,注意这里都是点方法,不是点类

看到,apply就是生成代理类得函数。接着点进去,在实现类中找到

然后到

其中proxyName就是代理类得类名,porxyPkg是$Proxy所以代理类就是$Proxy0,$Proxy1这样得类名,往下翻是生成字节码得方法,其中生成字节码得方法不然看,属于安全问题而放在了一个安全得包中。但是我们将生成得字节码从内容中读出并放在文件中。反编译后如下。
原文:https://www.cnblogs.com/ant-xu/p/11720984.html