动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序 对象,它可以实现接口 InvocationHandler。通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 Invoke 方法,并传递代理实例、识别调用方法的 java.lang.reflect.Method 对象以及包含参数的 Object 类型的数组。调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。
UserManager
UserManagerImpl
LogHandlerimport
UserManager
public interface UserManager {
public void addUser(String userId, String userName);
public void delUser(String userId);
public void modifyUser(String userId, String userName);
public String findUser(String userId);
}
UserManagerImpl
public class UserManagerImpl implements UserManager {
public void addUser(String userId, String userName) {
try{
System.out.println("UserManagerImpl-->>addUser userId="+userId); }catch(Exception e){
throw new RuntimeException();
}
}
public void delUser(String userId) {
System.out.println("UserManagerImpl-->>delUser userId="+userId); }
public String findUser(String userId) { System.out.println("UserManagerImpl-->>findUser userId="+userId);
return "张三";
}
public void modifyUser(String userId, String userName) { System.out.println("UserManagerImpl-->>modifyUser userId="+userId); } }
LogHandlerimport
java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogHandler implements InvocationHandler {
private Object targetObject;
public Object newProxyInstance(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 {
System.out.println("start-->"+ method.getName()); for(int i=0; i>" + method.getName());
}catch(Exception e){
e.printStackTrace();
System.out.println("error-->>" + method.getName());
} return ret; } }
Clientpublic class Client {
/** * @param args */public static void main(String[] args) { LogHandler logHandler = new LogHandler();
UserManager userManager = (UserManager)logHandler.newProxyInstance(new UserManagerImpl());
//userManager.addUser("0001", "张三");
String name = userManager.findUser("0001"); System.out.println("name==" + name);
} }