cglib实现动态代理

一、步骤

  1. 创建Enhancer实例
  2. 通过setSuperclass方法来设置目标类
  3. 通过setCallback 方法来设置拦截对象
  4. create方法生成Target的代理类,并返回代理类的实例

二、示例


         cglib
         cglib
         3.3.0
     

(1)目标对象(被代理对象)

package com;
/**
 * 目标对象(代理对象)
 */
public class Target{
    
    public void sayHello(String say) {
        System.out.println("Target.sayHello() "+say);
    }
    
}

(2)拦截器类


package com;

import java.lang.reflect.Method;


import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class MyMethodInterceptor implements MethodInterceptor {

	/**
	 * obj:cglib生成的代理对象 
	 * method:被代理对象方法 
	 * args:方法入参
	 * proxy:代理方法
	 */
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("======插入前置通知======");
		Object object = proxy.invokeSuper(obj, args);
		System.out.println("======插入后者通知======");
		return object;
	}

}

(3)测试

package com;

import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;

public class CgLibProxy {
    public static void main(String[] args) {
        //在指定目录下生成动态代理类,我们可以反编译看一下里面到底是一些什么东西
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\java\\java_workapace");
        
        //创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
        Enhancer enhancer = new Enhancer();
        
        // 设置enhancer对象的父类
        enhancer.setSuperclass(Target.class);
        // 设置enhancer对象的父类
        enhancer.setCallback(new MyMethodInterceptor());
        // 生成代理类并返回一个实例
        Target t = (Target)enhancer.create();
        // 通过代理对象调用目标方法
        t.sayHello("hello cglib");    
    }
}

cglib实现动态代理_第1张图片

参考:https://www.jianshu.com/p/d610b9255430

          https://www.cnblogs.com/cruze/p/3865180.html

          https://blog.csdn.net/yhl_jxy/article/details/80633194

你可能感兴趣的:(设计模式)