Java对于动态代理的理解

Java动态代理


前言

这是自己的第一篇博客,就来写写自己关于对Java动态代理方面的理解,如果有什么错误的地方,还请各位前辈指出来加以斧正。


一、代理设计模式是什么?

简单的来说,设计模式就是前辈为了解决一些特定的问题而总结出来的一种实现方式

代理设计模式三大对象

1:真实对象
2:代理对象
3:抽象对象

使用代理设计模式的优点

1:保护你的真实对象
2:让真实对象的职责更明确
3:方便你的代码进行扩展

代理设计模式的三种实现方式

1:静态代理实现
2:JDK动态实现
3:CGlib动态实现
其中两种动态的实现方法才是需要真正去理解的

二、具体的三种实现方式

1.静态代理实现

定义一个抽象接口类()
代码如下(示例):

public interface a{
	void eat();
}

定义一个真实对象类实现抽象类方法

public class b implements a{
	@Override
	public void eat() {
		System.out.println("吃");
	}
}

定义一个代理对象实现抽象接口类的方法

public class c implements a{
	b  zhenShi=new b();
	@Override
	public void chifan() {
		//调用真实对象前执行的操作
		System.out.println("。。。");
		//2.调用真实对象的功能
		zhenShi.eat();
		//3.调用真实对象后执行的操作
		System.out.println("....");
	}
}

形象一点就是把代理对象当成为一个中间人,比方说一个人要租房,代理对象就是中介,真实对象就是房东,抽象对象就是你,你的功能就是租房,房东就是只负责租房给你功能,其余的剩下的比方看房什么的就全部交由中介来做。目的就是为了让真实对象的功能更加明确。

2.jdk动态代理

代码如下(示例):

//抽象功能
public interface a{
	void eat();
}

//真实对象
public class b implements a{
	@Override
	public void eat() {
		System.out.println("吃");
	}
}


/**
  * 生成代理对象的处理器
 * 生成代理对象,调用对应invoke方法
 */
 //编写jdk动态代理控制器类实现InvocationHandler接口
public class JdkProxyHandler implements InvocationHandler{
	b bb=new b();
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("...");
		//真实对象的方法
		Object obj=method.invoke(bb, args);
		System.out.println("...");
		return obj;
	}
}

jdk动态代理是基于java的反射机制实现的,运行效率基于Cglib来说较低,还是不推荐使用jdk来实现

3.Cglib动态代理

代码如下(示例):

/**
  * 真实目标对象
 */
public class b{
	public void eat() {
		System.out.println("吃");
	}
}

/**
 * cglib动态代理的控制器
 * @author meimei
 */
public class CglibProxyHandler implements MethodInterceptor{
	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
		System.out.println("...");
		Object obj=arg3.invokeSuper(arg0, arg2);
		System.out.println("....");
		return obj;
	}
}

//测试类
public class Test {
	public static void main(String[] args) {
		//生成代理对象  是真实对象的子类
		Enhancer  enhancer=new Enhancer();
		//设置目标对象,父类
		enhancer.setSuperclass(b.class);
		//设置调用动态代理控制器
		enhancer.setCallback(new CglibProxyHandler());
		b bb=(b)enhancer.create();
		bb.eat();
	}
}

在这里插入图片描述
用cglib时需要导入这个jar包

目标对象不需要实现接口,生成的代理对象是真实对象的子类。
基于字节码实现,运行效率相对于jdk要高。


总结

以上就是今天要记载的一些内容,本文只是简单的讲述了动态代理的的使用方法,具体的实现还是得靠自己不断在实践中摸索,过几天我会在写一边基本基于动态代理实现AOP,记录自己的点滴成长。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值