基于接口的动态代理
提供者:JDK官方的Proxy类。
要求:被代理类最少实现一个接口。
接口:
interface Istart{
public void sing(String song);
}
实现类:
class Baobao implements Istart{
@Override
public void sing(String song) {
System.out.println(song);
}
}
JDK的代理类:
//此方式必须要实现至少一个接口
Istart jj = (Istart) Proxy.newProxyInstance(baobao.getClass().getClassLoader(), baobao.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用方法的时候才到这里");
System.out.println("寻找场地");
method.invoke(baobao,args);//传入接口的实现方法,有两个baobao与jj,jj的话会死递归
System.out.println("举办庆功宴");
return null;
}
});
jj.sing("单身狗");
基于子类的动态代理
提供者:第三方的CGLib,如果报asmxxxx异常,需要导入asm.jar。
要求:被代理类不能用final修饰的类(最终类)。
被代理类可以实现接口,也可以不实现接口
代理可以不实现接口 因此产生的代理可以由接口接收,也可以由父类接收
class Baobao{
public void sing(String song) {
System.out.println(song);
}
}
产生代理
//创建一个Baobao子类代理对象
Baobao jj = (Baobao) Enhancer.create(baobao.getClass(), new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("调用方法的时候才到这里");
System.out.println("寻找场地");
method.invoke(baobao, objects);//传入接口的实现方法,有两个baobao与jj,jj的话会死递归
System.out.println("举办庆功宴");
return null;
}
});
jj.sing("我的");