Java动态代理

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

动态代理
动态代理可以被我们动态的生成代理类和代理对象
目前java动态代理的实现有两种
jdk的动态代理
基于CGlib的动态代理
jdk的动态代理
Proxy用来创建代理类和对象
InvocationHandler调用处理器
Method方法
复习反射
动态语言谈起
反射可以使用一部分动态语言的特征
在运行的过程中识别类的能力
反射就像一面镜子一样能够照出对象的原型
使用反射
Class类实例
反射的入口
Class c = Object.class;
Class c = object.getClass();
Class c = Class.forName(“java.lang.object”);
Field:属性
get();
set();
Method方法
m.invoke();
o.toString();
o.equals(o2);
Constructor:构造器
反射动态编程自己封装一个dao
动态代理的理解
InvocationHandler接口
写一个接口实现此接口
MyInvocationHandler{
invoke();
}
真实对象
UserService
代理对象
userService2 = Proxy.newProxyInstance(ClassLoader,接口,MyInvocationHandler);
userService2.save();
当我们调用代理对象的方法时会将请求发送给InvocationHandler的invoke方法
类比
真实对象 userService servlet
过滤器 invocationHandler filter
方法 invoke doFilter
jdk动态代理的开发步骤
创建目标对象和接口真实角色和抽象角色
public interface Rentable {
public boolean rent(int price);
public void buy(String name,int price);
}

public class Houser implements Rentable{
	public boolean rent(int price) {
	if(price > 2000) {
		System.out.println("房屋出租成功价格是"+price);
		return false;
	}	
	return false;
	}
	public void buy(String name, int price) {
		System.out.println("买"+name+"的价格是"+price);
	}
}

创建一个invocationHandler的实现类并实现invoke方法
public class MyInvocationHandler implements InvocationHandler {
//真实对象
Object obj;
public MyInvocationHandler(Object obj) {
super();
this.obj = obj;
}
/**
* proxy:代理对象
* method被调用的方法
* args:方法参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Long start = System.currentTimeMillis();
System.out.println(method.getName()+“方法被调用”+“参数是”+Arrays.toString(args));
//调用真实对象的方法
Object result = method.invoke(obj, args);
System.out.println((method.getName()+“方法调用完毕共耗时”+(System.currentTimeMillis()-start)));
return result;
}
}
通过Proxy.newProxyInstance()方法来获得代理对象
调用代理对象的方法
public class TestProxy {
public static void main(String[] args) {
MyInvocationHandler handler = new MyInvocationHandler(new Houser());
Rentable r = (Rentable) Proxy.newProxyInstance(Houser.class.getClassLoader(), new Class[] {Rentable.class}, handler);
//这里调用invoke
r.rent(3000);
r.buy(“傻逼”, 88888);
}
}
jdk动态代理的缺点
使用jdk动态代理必须使用接口抽象角色

CGlib动态代理
第三方的开源组件作用是用来生成动态代理对象与jdk动态代理不同的是它不需要使用接口生成的代理类是真实对象的子类所以真实对象不能为final
目前主流的框架都使用了CGlib例如mybatisspringhibernate
使用CGlib动态代理创建代理对象
MethodInterceptor:接口当调用代理对象的方法时会将方法请求发送给与之关联的MethodInterceptor的intercept
Enhancer类用来创建代理对象

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java