我先说下我对动态代理的理解把,大家有不同意见和认识的贴出来,交流一下
首先,需要注意的一点便是:使用JDK的动态代理,必须实现相应的接口。下面以程序为例说明:
1.接口类:
public interface UserManager {
public void save(String username,String password);
public void addUser(String username,String password);
public String getUserName(int id);
}
2.实现类:
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
// TODO Auto-generated method stub
System.out.println("-----------------addUser()-------------------");
}
public String getUserName(int id) {
System.out.println("-----------------getUserName()-------------------");
return null;
}
public void save(String username, String password) {
System.out.println("-----------------save()-------------------");
}
}
3.动态代理类:
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);
}
//调用代理类上的方法,但在调用之前要调用InvocationHandler接口的invoke()方法,所以我们
//可以在invoke()方法中调用相应的安全检查方法checkSecurity(),进行相应的安全性检查。
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//调用checkSecurity()进行相应的安全性检查
checkSecurity();
Object result = null;
try{
result = method.invoke(this.targetObject, args);
}catch(Exception e){
e.printStackTrace();
}
return result;
}
//安全性检查方法
private void checkSecurity(){
//进行相应的安全性检查操作
System.out.println("------------------checkSecurity()-------------------");
}
}
4.调用类:
public class Client {
public static void main(String[] args) {
SecurityHandler sh = new SecurityHandler();
UserManager us = (UserManager)sh.newProxy(new UserManagerImpl());
us.addUser("lizi", "123456");
}
}
这样就实现了JDK的动态代理,并进行了相应的安全性检查。