java反射:3、动态代理的应用以及实现

动态代理的概念

在业务中使用动态代理,一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。我们一般所熟知的Spring的AOP原理就是基于动态代理实现的。

动态代理的实现

动态代理有两种实现方式:
一种是JDK自身的动态代理,是利用反射API实现的,在生成类上比较高效;
另一种是CGLIB动态代理,是利用的ASM框架对字节码编译的,运行效率较高。

(1)JDK动态代理实现AOP

步骤:
(1)创建接口类;
(2)创建实现类;
(3)创建代理类——proxy
(4)代理的调用

package Test01;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class test02 {
	public static void main(String[] args) {
        test test = new testImp();
        InvocationHandler testProxy = new testProxy(test);
        test proxyInstance = (test) Proxy.newProxyInstance(testProxy.getClass().getClassLoader(), test.getClass().getInterfaces(), testProxy);
        proxyInstance.hello("您真6");
    }

	
}

/**
 * 1、定义接口类
 * @author Linlin Zhao
 *
 */
interface test{
	public abstract void hello(String content);
}
/**
 * 2、定义实现类
 * @author Linlin Zhao
 *
 */
class testImp implements test{
	@Override
	public void hello(String content) {
		System.out.println("6666666666666"+"-----"+content);
		
	}
}
/**
 * 3、创建代理类
 * @author Linlin Zhao
 *
 */
class testProxy implements InvocationHandler{
	private test test;

    public testProxy(test test) {
        this.test = test;
    }
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("begin*************");
		Object invoke=method.invoke(test, args);
		System.out.println("end*************");
		return invoke;
	}
	
}

(2)CGLIB动态代理实现AOP

需要引入cglib的jar包。
CGLIB动态代理实现AOP,使用ASM框架直接对字节码进行操作,可以生成目标类的子类去完成一个代理的功能。

(3)两者对比

(1)JDK动态代理(要求必须有接口)只能够对接口进行代理,不能对普通的类进行代理;CGLIB(要求必须有继承)能够代理普通类;
(2)JDK动态代理使用Java原生的反射API进行操作,在生成类上比较高效;CGLIB使用ASM框架直接对字节码进行操作,在类的执行过程中比较高效。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值