动态代理
动态代理实现 MethodInterceptor 他可以在使用时再确定要代理什么并且由使用者决定要调用的方法。本质上是使用了反射来实现的
- 定义一个接口
public interface IRegisterService {
void register(String name, String pwd);
}
- 一个接口的实现类
public class RegisterServiceImpl implements IRegisterService {
@Override
public void register(String name, String pwd) {
System.out.println(String.format("【向数据库中插入数据】name:%s,pwd:%s", name, pwd));
}
}
- 一个实现了InvocationHandler接口的类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
class InsertDataHandler implements InvocationHandler {
// 持有一个被代理类的引用, 但是这个被代理类不是具体的类。而是超类
Object obj;
public Object getProxy(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doBefore();
// 在这里调用被代理的方法
Object result = method.invoke(obj, args);
doAfter();
return result;
}
private void doBefore() {
System.out.println("[Proxy]一些前置处理");
}
private void doAfter() {
System.out.println("[Proxy]一些后置处理");
}
}
- 测试
public class DynamicProxy {
public static void main(String[] args) {
// 实例化被代理类
IRegisterService iRegisterService = new RegisterServiceImpl();
// 实例化代理类
InsertDataHandler insertDataHandler = new InsertDataHandler();
// 通过Proxy获取代理类
IRegisterService proxy = (IRegisterService)insertDataHandler.getProxy(iRegisterService);
// 执行方法
proxy.register("RyanLee", "123");
}
}