Boss:
package proxy.cglib; public class Boss{ public void findPerson() { System.out.println("我要找java架构师"); } }
WebApp:
package proxy.cglib; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * 方法拦截器 */ public class WebApp implements MethodInterceptor { public Object getInstance(Class clazz)throws Exception{ Enhancer enhancer = new Enhancer(); //告诉cglib,生成的子类需要继承哪个类 enhancer.setSuperclass(clazz); //设置回调 enhancer.setCallback(this); //生成源代码 //编译成class文件 //加载到JVM中,并返回被代理对象 return enhancer.create(); } //字节码重组 @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("找Person,找我WebApp"); System.out.println("---------------"); //这个obj的引用是由CGLib给我们new出来的 //cglib new出来以后的对象,是被代理对象的子类 //在new子类之前,实际上默认先调用了我们super()方法的, //new子类的同时,必须先new出来父类,这就相当于是间接的持有了我们父类的引用 //子类重写了父类的所有的方法 //我们改变子类对象的某些属性,是可以间接的操作父类的属性的 methodProxy.invokeSuper(o,objects);//这里是调父类的(子类死循环) System.out.println("---------------"); return null; } }
Test:
package proxy.cglib; /** * JDK的动态代理是通过接口来进行强制转换的 * 生成以后的代理对象,可以强制转换为接口 * *CGLib的动态代理是通过生成一个被代理对象的子类,然后重写父类的方法 * 生成以后的对象,可以强制转换为被代理对象 * 子类引用赋值给父类 */ public class Test { public static void main(String[] args){ try { Boss boss = (Boss) new WebApp().getInstance(Boss.class); boss.findPerson(); }catch (Exception e){ e.printStackTrace(); } } }
原文地址:https://www.cnblogs.com/fly-book/p/10361846.html
时间: 2024-10-09 01:01:06