import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SecurityHandler implements InvocationHandler {
private Object targetObject;
/*targetObjet 为要实例的JAVA类, 在这里指的就是 UserManagerImpl
调用代码写法:
SecurityHandler handler = new SecurityHandler();
UserManager userManager = (UserManager)handler.newProxy(new UserManagerImpl());
userManager.deleteUser(1);
在调用的时候,userManager 已经是个代理的类,调用里面的deletUser()方法时,他就会去调用invoke()方法
*/
public Object newProxy(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
checkSecurity(); // 关注点的具体实现 里面可以书写任何的检验代码
Object ret = null;
try {
ret = method.invoke(this.targetObject, args);
}catch(Exception e) {
e.printStackTrace();
throw new java.lang.RuntimeException(e);
}
return ret;
}
private void checkSecurity() {
//相应个性化的代码
System.out.println("----------checkSecurity()---------------");
}
}
说明:
1. newProxy(Object targetObject) 是用来获得一个代理实例
2. UserManagerImpl() 是自己写的一个类, 我们现在对它生成代理
3. invoke() 调用生成代理类调用它的方法,它调用了这个方法
4 checkSecurity() 这是一个自己定义的一个方法:例如:登录验证不影响业务逻辑的功能代码