动态代理,好比有一个机器人,可以将一个对象代理出一个代理对象,现实生活中例子,就好似一个影视公司,可以为艺人提供一个经纪人,这个经纪人就是代理了艺人,影视公司就是中介。JDK就可以做这个,但需要三个参数,分别是类加载器,中介对象,以及要代理的对象。
接口:
package com.test3;
public interface Service {
public String create();
public void update();
}
实现类:
package com.test3;
public class ServiceImpl implements Service {
@Override
public String create() {
System.out.println("ServiceImpl.create");
return "create";
}
@Override
public void update() {
System.out.println("ServiceImpl.update");
}
}
工具类(用来在代理中介中增加功能,实际例子,就比如spring的aop对功能增加的前置后置的通知方法):
package com.test3;
public class Util {
public static void before() {
System.out.println("Util.before");
}
public static void after() {
System.out.println("Util.after");
}
}
中介公司:
package com.test3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
public Service service = new ServiceImpl();
public void setService(Service service) {
this.service = service;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Util.before();
Object object = method.invoke(service, args);
Util.after();
return object;
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), this);
}
}
测试类:
package com.test3;
public class TestApp {
public static void main(String[] args) {
Service service = new ServiceImpl();
MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
myInvocationHandler.setService(service);
Service proxyService = (Service) myInvocationHandler.getProxyInstance();
System.out.println(proxyService.getClass());
proxyService.create();
}
测试结果:
class com.sun.proxy.$Proxy0
Util.before
ServiceImpl.create
Util.after
通过测试结果可以发现,生成的代理类的class类型为proxy类型,在执行代理对象具体的方法的时候,JDK自己会返回到invocationhandler里执行invoke方法。
下面是一个万能代理,很简单,只是将对象都换成了Object类型而已
public class ZhongJie implement InvocationHandler{
Object obj = new Object();
public void setObject(Object obj){
this obj = obj;
}
@Override
public Object invoke(Object proxy,Method method,Object[] args) throw Throwable{
System.out.println("此处增加一个功能1");
Object object = method.invoke(obj,args);
System.out.println("此处增加一个功能2");
return object;
}
}