动态代理实现方法增强

本文详细介绍了Java中的两种动态代理技术:JDK动态代理和CGlib动态代理。通过示例代码展示了如何创建和使用这两种代理,包括接口定义、实现类、代理类的生成以及测试用例。JDK动态代理通过实现InvocationHandler接口来实现方法增强,而CGlib动态代理则是通过继承目标类并拦截方法调用来实现增强。
摘要由CSDN通过智能技术生成

一. jdk动态代理

1. 接口

public interface People {

    String createPeopleName(String name);

}

2. 实现类

public class Student implements People
{
    @Override
    public String createPeopleName(String name) {
        System.out.println("测试jdk动态代理名称为" + name);
        return "JDK" + name;
    }
}

public class Teacher implements People {
    @Override
    public String createPeopleName(String name) {
    System.out.println("这是老师代理");
        return "老师 " + name;
    }
}

3. 代理类

public class ProxyFactory<T> {

	// ****************方式1 start*******************
    private final Class<T> classes;
    public ProxyFactory(Class<T> classes){
        this.classes = classes;
    }

    @SuppressWarnings("unchecked")
    public T getInstance(){
        /**
         * ClassLoader       : 类加载器 用于加载代理类 通过目标对象获取类加载器
         * Interfaces        : 代理类实现的接口字节码对象
         * InvocationHandler : 代理对象调用处理程序
         */
        return (T)Proxy.newProxyInstance(classes.getClassLoader(), classes.getInterfaces(), new InvocationHandler() {
            /**
             * @param proxy 代理对象
             * @param method 对接口中的方法进行封装的method对象
             * @param args 参数
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("jdk动态代理增强");
                return method.invoke(classes.newInstance(), args);
            }
        });
    }

	// ****************方式1 end*********************
	// ****************方式2 start*******************
	
    @SuppressWarnings("unchecked")
    public static <T> T proxyObject(Class<T> parentClass, Class<? extends T> sonClass)
    {
        /**
         * ClassLoader       : 类加载器 用于加载代理类 通过目标对象获取类加载器
         * Interfaces        : 代理类实现的接口字节码对象
         * InvocationHandler : 代理对象调用处理程序
         */
        return (T) Proxy.newProxyInstance(sonClass.getClassLoader(), new Class[]{parentClass}, new InvocationHandler() {
            /**
             * @param proxy 代理对象
             * @param method 对接口中的方法进行封装的method对象
             * @param args 参数
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                System.out.println(sonClass.getSimpleName());
                // 根据不同的代理对象 有不同的处理策略
                if(sonClass.getSimpleName().equals(Student.class.getSimpleName())){
                    Object[] sz = new Object[args.length];
                    int index = 0;
                    for (Object arg : args) {
                        System.out.println(arg.toString());
                        sz[index] = arg.toString() + "哈哈";
                    }
                    return method.invoke(sonClass.newInstance(), sz);
                }else{
                    return method.invoke(sonClass.newInstance(), args);
                }

            }
        });
    }
	// ****************方式2 end*********************

}

4. 测试类

public class Client {

    public static void main(String[] args) throws Exception{
    	// 方式1测试
        ProxyFactory proxyFactory = new ProxyFactory(Student.class);
        People instance = (People)proxyFactory.getInstance();
        System.out.println(instance.createPeopleName("张jdk"));
        System.out.println("--------------------------------");
        ProxyFactory proxyFactoryx = new ProxyFactory(Teacher.class);
        People instancex = (People)proxyFactoryx.getInstance();
        System.out.println(instancex.createPeopleName("李jdk"));

		// 方式2测试
        People student = ProxyFactory.proxyObject(People.class, Student.class);
        System.out.println(student.createPeopleName("李"));
        System.out.println("--------------------------------");
        People teacher = ProxyFactory.proxyObject(People.class, Teacher.class);
        System.out.println(teacher.createPeopleName("王"));

    }

}

2. cglib动态代理

1. 依赖

        <!-- https://mvnrepository.com/artifact/cglib/cglib -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>

2. 代理对象类

public class Student {

    public String createPeopleName(String name) {
        System.out.println("测试jdk动态代理名称为" + name);
        return "JDK" + name;
    }
}

3. 代理类

public class ProxyFactory implements MethodInterceptor {
    
    private Object obj;

    public ProxyFactory(Object obj){
        this.obj = obj;
    }

    public Object getProxyObj(){
        // 创建cglib对象
        Enhancer enhancer = new Enhancer();
        // 设置父类(指定代理类的付类)
        enhancer.setSuperclass(this.obj.getClass());
        // 设置回调函数
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib执行");
        return methodProxy.invoke(obj, objects);
    }
}

4. 测试类

public class Client {

    public static void main(String[] args) {
        ProxyFactory proxyFactory = new ProxyFactory(new Student());
        Student instance = (Student)proxyFactory.getProxyObj();
        System.out.println(instance.createPeopleName("李cglib"));
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值