动态代理类实现InvocationHandler接口,利用反射机制,动态地生成代理对象及其调用方法。提高了代码的可扩展性和可维护性,更加符合OCP原则。
继续使用《Java静态代理》中的实例。
UserManager.java

/** *//**
* 定义UserManager接口,包含对用户增删改查四个抽象方法
* @author Administrator
*
*/

public interface UserManager
{
public void addUser(String username,String password);
public void deleteUser(int id);
public void modifyUser(int id,String username,String password);
public String findUserById(int id);
}

UserManagerImpl.java
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
System.out.println("UserManagerImpl.addUser()
");
}
public void deleteUser(int id) {
System.out.println("UserManagerImpl.deleteUser()
");
}
public String findUserById(int id) {
System.out.println("UserManagerImpl.findUserById()
");
return null;
}
public void modifyUser(int id, String username, String password) {
System.out.println("UserManagerImpl.modifyUser()
");
}
}

SecurityHandler.java
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;
//调用Proxy中的静态方法newProxyInstance()
/**
* loader - 定义代理类的类加载器
* interfaces - 代理类要实现的接口列表
* h - 指派方法调用的调用处理程序,即SecurityHandler类
*/
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
/**
* proxy - 代理实例
* method - 对应于在代理实例上调用的接口方法的 Method 实例。
* args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数
* 被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
checkSecurity();
Object ret = null;//接收调用方法的返回值
try {
ret = method.invoke(targetObject, args);
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
private void checkSecurity(){
System.out.println("SecurityHandler.checkSecurity()
");
}
}---实现InvocationHandler接口。

public class Client
{


public static void main(String[] args)
{

/**//*UserManager userManager = new UserManagerImpl();
userManager.addUser("zhangsan", "111");*/
UserManager userManager = (UserManager)new SecurityHandler().newProxy(
new UserManagerImpl());
userManager.addUser("zhangsan", "111");
}
}运行结果:
SecurityHandler.checkSecurity()...
UserManagerImpl.addUser()...