cglib实现动态代理简单使用

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();
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/fly-book/p/10361846.html
今日推荐