具体实现步骤:
第一步,创建接口和实现类,也可以称为目标类!
接口------
public interface targetImp {
public void dosome();
}
目标类-------------
public class target implements targetImp{
@Override
public void dosome() {
// TODO Auto-generated method stub
System.out.println("----doSomething");
}
}
第二步,创建InvocationHandler的实现类,和拦截器类
------------------------拦截器类,作用是在执行目标方法之前或者之后根据需求执行相应操作
public class interceptor {
public void befor(){
System.out.println("---------befor");
}
public void after(){
System.out.println("---------after");
}
}
----------------------------创建InvocationHandler实现类
public class MyHandler implements InvocationHandler {
private Object o;//被代理的对象
private interceptor i;
public MyHandler(){
}
public MyHandler(Object o){//在实例化的时候将目标类引用进来 并且实例化拦截器
this.o=o;
i=new interceptor();
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)//Object proxy:指被代理的对象。 Method method:要调用的方法
throws Throwable { //Object[] args:方法调用时所需要的参数
Object res=null;
i.befor();
res=method.invoke(o, args);//实现目标类的方法
i.after();
return res;
}
}
第三步,创建代理类
public class MyProxy {
public Object getProxy(Object o){
MyHandler h=new MyHandler(o);
return Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces(),h);
}
}
第四步,测试
public class test {
public static void main(String[] args) {
targetImp t=new target();
MyProxy my=new MyProxy();
targetImp res=(targetImp)my.getProxy(t);
res.dosome();
}
}
第五步 测试结果
---------befor
----doSomething
---------after
总结:动态代理的底层是java的反射机制,在框架的使用上面比较多,目标类和接口都是通过后期的配置文件去指定的,所以我们只要指定了类名和接口,通过动态代理的方式去执行方法