动态代理:本来应该自己做的事情却请了别人来做,被请的人就是代理对象。所谓动态代理就是在程序运行过程中产生的这个对象。动态代理通过反射实现。在Java中的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。注意JDK提供的代理只能针对接口做代理。
public interface StudentDao {
public abstract void add();
public abstract void delete();
public abstract void update();
public abstract void find();
}
public class StudentDaoImpl implements StudentDao {
@Override
public void add() {
System.out.println("add...");
}
@Override
public void delete() {
System.out.println("delete...");
}
@Override
public void update() {
System.out.println("update...");
}
@Override
public void find() {
System.out.println("find...");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("权限校验");
Object obj=method.invoke(target, args);
System.out.println("返回代理对象");
return obj;
}
}
import java.lang.reflect.Proxy;
public class StudentTest {
public static void main(String[] args) {
StudentDao s = new StudentDaoImpl();
s.add();
s.delete();
s.update();
s.find();
System.out.println("---------------");
MyInvocationHandler handler = new MyInvocationHandler(s);
StudentDao proxys = (StudentDao) Proxy.newProxyInstance(s.getClass().getClassLoader(),
s.getClass().getInterfaces(), handler);
proxys.add();
proxys.delete();
proxys.update();
proxys.find();
}
}
add...
delete...
update...
find...
---------------
权限校验
add...
返回代理对象
权限校验
delete...
返回代理对象
权限校验
update...
返回代理对象
权限校验
find...
返回代理对象
上面就是动态代理的实现过程。那么为什么要使用动态代理呢?开闭原则:对修改关闭,对扩展开放。很多时候我们需要对一个类的功能做一些扩展,这个时候我们不是去修改原来的类,而是生成一个代理对象,对你需要的扩展功能进行添加等。
注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教。