上一节演示的是静态代理模式,本节演示的是静态代理模式,既然是动态,那么就不存在UserManagerImplProxy类。
使用动态代理我们需要声明一个类SecurityHandler,这个类要实现InvocationHandler接口。
在类中定义一个产生动态代理的方法newProxy();同时把我们验证的代码放到这个类中。通过SecurityHandler,当我们调用方法时默认会调用SecurityHandler类invoke方法,我们在这个方法中进行安全性检查,检查通过后在调用真实的方法。需要注意的是目标对象接口中的部分方法是存在返回值的。
package com.szy.spring;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SecurityHandler implements InvocationHandler
{
private Object targetObject;
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);
//ret接受存在的返回值,不存在返回值则为Null
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
public void checkSecurity()
{
System.out.println("--------UserManagerImpl.checkSecurity()----------");
}
}
使用这种方式维护起来相对比较好,我想进行安全性检查就进行,不想就不进行,很方便。
下面进行客户端调用
package com.szy.spring;
public class Client
{
public static void main(String[] args)
{
SecurityHandler handler=new SecurityHandler();
//创建代理对象
UserManager userManager=(UserManager)handler.newProxy(new UserManagerImpl());
userManager.addUser("coolszy", "kuka");
}
}