动态代理
利用反射机制在运行时创建代理类。
接口、被代理类不变,我们构建一个handler类来实现InvocationHandler接口。
实现类里有三个部分
1、被代理类
2、构造方法,主要是给被代理类赋值
3、invoke方法,三个参数:代理类、方法和参数
如果要在执行方法前后做一些其他处理,就在该方法中实现
代码实现
1、代理类WorkHandler
package com.zhouzy.sjms.service;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class WorkHandler implements InvocationHandler {
private Object object;//被代理类
public WorkHandler(){
}
public WorkHandler(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
System.out.println("执行前要做的事情==============");
Object invoke = method.invoke(object, args); //记住,这里的第一个参数是被代理类
System.out.println("执行后要做的事情==============");
return invoke;
}
}
2、接口
package com.zhouzy.sjms.service;
public interface CommonInterface {//
public void doProcess();
}
3、实现类
package com.zhouzy.sjms.service;
public class Customer implements CommonInterface{
@Override
public void doProcess() {
System.out.println("正在执行中");
}
}
测试
package com.zhouzy.sjms.service;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Application {
public static void main(String[] args) {
/*ProxyDo proxyDo = new ProxyDo();
proxyDo.doProcess();*/
CommonInterface customer = new Customer();//接口定义,前面不要用实现类
InvocationHandler proxyHandler = new WorkHandler(customer);
//用接口类接收,强转成接口
CommonInterface proxy = (CommonInterface)Proxy.newProxyInstance(customer.getClass().getClassLoader(), customer.getClass().getInterfaces(), proxyHandler);
proxy.doProcess();
}
}
结果:
动态代理具体步骤:
- 通过实现 InvocationHandler 接口创建自己的调用处理器;
- 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
- 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
- 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。