静态代理
接口:A 类:B实现了A 代理类:有个A属性,实现A接口
interface A{
func();
}
class B implements A{
func(){}
}
class Proxy implements A{
A a=new B; //被代理的类
func(){
//被织入的内容
xxxx
a.func();
//被织入的内容
xxxx
}
}
jdk动态代理
必须实现接口
/*
第一步:创建接口,JDK动态代理基于接口实现,所以接口必不可少(准备工作)
第二步:实现InvocationHandler接口,重写invoke方法(准备工作)
第三步:调用Proxy的静态方法newProxyInstance方法生成代理实例(生成实例时需要提供类加载器,我们可以使用接口类的加载器即可)
第四步:使用新生成的代理实例调用某个方法实现功能。
*/
class AProxy implements InvocationHandler{
Object targeObj; //被代理的对象(必须实现接口,即不能为普通类)
public AProxy(Object obj){
this.targeObj=obj;
}
@Overide
public Object invoke(Object obj,Method method,Object[] args){
//被织入的内容
xxxxx
Object result = method.invoke(this.targetObje,args);
//被织入的内容
xxxxx
return result;
}
}
main(){
A a = new B();
InvocationHandler ih = new AProxy(a);
A proxy = Proxy.newProxyInstance(A.getClass().getClassLoader(),
A.getInterfaces(),ih);
proxy.add(1,2);
}
class AProxy implements InvocationHandler{
Object targeObj; //被代理的对象(必须实现接口)
public Object getProxyObj(Object obj){
this.targeObj=obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces().this);
}
@Overide
public Object invoke(Object obj,Method method,Object[] args){
//被织入的内容
xxxxx
Object result = method.invoke(this.targetObje,args);
//被织入的内容
xxxxx
return result;
}
}
main(){
A a = (A)new AProxy.getProxyObj(new B());
a.func();
}
cglib动态代理
类似于代理类继承目标类,重写方法
class CglibProxy implements MethodInteceptor{
Object targetObj;
public Object getProxyInstance(Object obj){
this.targetObj = obj;
Enhancer eh =new Enhancer();
//将目标对象设置为父类
eh.setSuperclass(obj);
//设置回调
eh.setCallback(this);
//创建子类
return eh.create();
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//织入
xxxxx
Object result = method.invoke(this.targetObj,args);
xxxx
return result;
}
}
//普通类 不需要实现接口
class User{
public void printfName(){
xxxxx
}
}
main(){
User user = (User) new CglibProxy().getProxyInstance(new User());
user.printfName();
}