public interface Student {
public void login();
public void submit();
}
public class StudentImp implements Student {
@Override
public void login() {
System.out.println("登录");
}
@Override
public void submit() {
System.out.println("提交");
}
}
public class TestProxy {
public static void main(String[] args) {
ProxyFactory<Student> factory = new ProxyFactory<Student>(new StudentImp());
Student proxy = factory.getProxy();
proxy.login();
proxy.submit();
}
}
/*
* 使用泛型,这样调用者获取返回的对象不用再强转
* 如果不适用泛型则返回的是Object类型
*/
class ProxyFactory<T>{
Object target;
public ProxyFactory(Object obj){
this.target = obj;
}
public T getProxy(){
return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new MyHandler(target));
}
}
class MyHandler implements InvocationHandler{
Object target;
public MyHandler(Object obj){
this.target = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("权限检验前");
//调用基础方法的对象,需要通过构造方法传入
//如果使用invoke方法的proxy会报错
Object obj = method.invoke(target, args);//执行被代理target对象的方法
System.out.println("执行安全检查");
return obj;
}
}