什么是动态代理呢?
我们先来说一个案例,假设现在存储了一些数据,我们对数据有增删改查这四种权限,当我们操作后需要留下记录,如果将增删改查写成四个方法,那我们是不是还需要在这四个方法里再添加我们的操作记录,有没有什么办法可以让我的权限与这些记录分开呢?
动态代理实现:
先写用户接口
public interface UserImp{
public abstract void add();
public abstract void delete();
public abstract void update();
public abstract void select();
}
实现接口:
public class User implements UserImp{
@Override
public void add(){
System.out.println("添加数据");
}
@Override
public void delete(){
System.out.println("删除数据");
}
@Override
public void update(){
System.out.println("修改数据");
}
@Override
public void select(){
System.out.println("查找数据");
}
}
Run部分:
注意这里为了使用方法,我们类型转换用的是用户接口类而不是他的子类
否则报错:java.lang.ClassCastException:
public class DynamicAgentDemo {
public static void main(String[] args) throws Exception{
User user = new User();
Object o = Proxy.newProxyInstance(user.getClass().getClassLoader(),
user.getClass().getInterfaces(), new MyInvocationHandler(user));
UserImp u=(UserImp) o;
u.add();
u.delete();
u.select();
u.update();
}
}
这是实现动态代理的方法:
public static Object newProxyInstance(ClassLoader loader,类<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。
最后一个InvocationHandler需要我们自己实现
public class MyInvocationHandler implements InvocationHandler {
private Object obj;
public MyInvocationHandler(Object obj) {
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(obj, args);
System.out.println("操作日志");
return result;
}
}
运行结果: