栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 中jdk动态代理和CGLIB动态代理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 中jdk动态代理和CGLIB动态代理

java 中jdk动态代理和CGLIB动态代理
  • 1、jdk动态代理实践过程
    • 定义接口
    • 定义接口实现类
    • 定义代理类行为(类似于spring中aop的各种通知)
    • 代理测试
    • 打印结果
  • 2、CGLIB动态代理实践过程
    • 创建被代理类
    • 创建代理工厂

jdk的动态代理是需要目标接口的,而spring提供的cglib代理是不需要目标接口的。

1、jdk动态代理实践过程 定义接口
public interface Person {
    public void rentHouse();
    public void rentHouse(String name);
}
定义接口实现类
public class Renter implements Person{
    @Override
    public void rentHouse() {
        System.out.println("租房");
    }
    @Override
    public void rentHouse(String name) {
        System.out.println("租房"+name);
    }
}
定义代理类行为(类似于spring中aop的各种通知)
public class RenterInvocationHandler implements InvocationHandler {
    // 被代理类,从构造方法传入
    private T target;
    public RenterInvocationHandler(T target) {
        this.target = target;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("租客和中介交流");
        // 调用
        Object result = method.invoke(target, args);
        System.out.println("租房结束");
        return result;
    }
}
代理测试
public static void main(String[] args) {
        // 被代理类
        Person renter = new Renter();

        RenterInvocationHandler renterInvocationHandler = new RenterInvocationHandler<>(renter);

        // 传入类加载器,代理类需要实现的接口,handler
        Person renterProxy = (Person)Proxy.newProxyInstance(Person.class.getClassLoader(),new Class[]{Person.class},renterInvocationHandler);

        renterProxy.rentHouse();
        System.out.println();
        renterProxy.rentHouse("越美国际");
    }
打印结果
租客和中介交流
租房
租房结束

租客和中介交流
租房越美国际
租房结束
2、CGLIB动态代理实践过程 创建被代理类
public class Renter2 {
    public void rentHouse() {
        System.out.println("租房");
    }
    public void rentHouse(String name) {
        System.out.println("租房"+name);
    }
}
创建代理工厂
public class ProxyFactory implements MethodInterceptor {
    // cglib工具类
    private Enhancer en = new Enhancer();
    // 被代理对象
    private T target;

    public ProxyFactory(T target) {
        this.target = target;
    }

    
    public T getProxyInstance(Class clazz){
        // 父类
        en.setSuperclass(clazz);
        // 回调类方法所在类
        en.setCallback(this);
        return (T)en.create();
    }

    
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("中介和租客交流");
        Object result = method.invoke(target,args);
        System.out.println("租房结束");
        return result;
    }

    
    public static void main(String[] args) {
        ProxyFactory renter2ProxyFactory = new ProxyFactory<>(new Renter2());
        Renter2 proxyInstance = renter2ProxyFactory.getProxyInstance(Renter2.class);
        
        proxyInstance.rentHouse();
        System.out.println();
        proxyInstance.rentHouse("越美国际");

    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/876790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号