1.代理的本质就是在非入侵的一种方式下对被代理对象方法的增强
说白了 就是在原有方法的情况下再加 日志 等东西
2.动态代理的本质就是一个代理工厂(实现了InvocationHandler接口的实现类),通过set方法set target(被代理的对象) 然后通过反射自动生成代理对象,代理对象调用方法时都会统一被invoke(cglib是inceptor)拦截 在invoke中可进行增强操作,比如加日志,这大概就是动态代理的简要过程。
动态代理最中通要的两个重点 Proxy 与 invocathander
Invocationhander 接口有一个invoke方法 这是 所有代理类对象调用方法的入口,至于为什么是入口会面会解释
接口
public interface Start {
String sing(String name);
String dance(String name);
}
接口实现类
public class LIUDeHua implements Start{
@Override
public String sing(String name)
{
System.out.println("给我一杯忘情水");
return "唱完" ;
}
@Override
public String dance(String name)
{
System.out.println("开心的马骝");
return "跳完" ;
}
}
class ProxyFactory implements InvocationHandler
//InvocationHandler实现类
{
// 目标类,也就是被代理对象
private Object target;
public void setTarget(Object 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 Object CreatProxyedObj()
{
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
实现InvocationHandler接口的实现类可以当做一个代理工厂,通过set方法注入被代理对象,让后通过反射生成代理对象 。
为什么代理对象调用方法会自动调用invoke方法
return 的一个代理对象是一个Proxy的一个实例,这个实例实现了InvocationHandler接口,并且这个代理对象的Class类是
P
r
o
x
y
0
,
这
个
Proxy0,这个
Proxy0,这个Proxy0类继承了Proxy,实现了接口 Start
Proxy类中newProxyInstance 传入3个参数 根据参数loader和interfaces调用方法 getProxyClass(loader, interfaces)创建代理类$Proxy0. $Proxy0类 实现了interfaces的接口,并继承了Proxy类.
下面就是将 $Proxy0类实例化
$Proxy0类
顺便把h传给proxy
最终代理对象的实例方法
其实是 父类的调用 hander 的invoke 传入方法对象与参数 最终进入拦截器进行方法调用。方法加强