1.JDK实现的动态代理
特点是需要有一个接口,然后利用反射实现动态代理
public class Person implements Judical{
@Override
public void civil() {
System.out.println(“Person.civil”+“民事诉讼”);
}
}
**
-
负责创建律师类
*/
public class Lawer implements InvocationHandler {
private T target;public Lawer(T target) {
this.target = target;
}@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(“先收取500的咨询费”);
Object result= method.invoke(target,args);
System.out.println(“再手1000的律师费”);
return result;
}
}
public interface Judical {
void civil();
}
public class DynamicProxyTest {
public static void main(String[] args) {
//创建一个普通对象
Person person=new Person();
//创建一个代理对象
InvocationHandler handler=new Lawer(person);
// Judical judical= (Judical) Proxy.newProxyInstance(Judical.class.getClassLoader(),new Class[]{Judical.class},handler);
Judical judical= (Judical) Proxy.newProxyInstance(Judical.class.getClassLoader(),person.getClass().getInterfaces(),handler);
judical.civil();
}
}
cgLib实现动态代理
public class Start {
String name;
public Start() {
}
public Start(String name) {
this.name = name;
}
public void show(){
System.out.println("Start.show"+this.name+"开始表演了");
}
}
/**
-
测试类
*/
public class DynamiccglibTest {
public static void main(String[] args) {
//创建真实对象
Start start=new Start(“胡歌”);
//创建代理对象
MethodInterceptor interceptor=new AgentMethodInterceptor(start);
//创建加强器,用来创建动态代理对象
Enhancer enhancer=new Enhancer();
//为加强器指定要代理的业务
enhancer.setSuperclass(start.getClass());
//设置回调:对于代理类上所有方法的调用,都会调用CallBack,而CallBack则要实现intercept()方法进行拦截
enhancer.setCallback(interceptor);
//最后创建代理对象并且返回
Start startProxy= (Start) enhancer.create();
//执行代码
startProxy.show();}
}
/*
代理类
*/
public class AgentMethodInterceptor implements MethodInterceptor {
private T target;
public AgentMethodInterceptor(T target) {
this.target = target;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println(“AgentMethodInterceptor.intercept经纪人开始先收50万”);
//通过父子关系实现代理
Object result= methodProxy.invokeSuper(o,objects);
System.out.println(“AgentMethodInterceptor.intercept+经纪人再收取100万”);
return result;
}
}
二者的区别: