动态代理类的应用场景:
比如类 UserManagerImpl 有 n 个方法,想要在每个方法执行之前,都想要打印一句话
客户 A 需要要使用 厂家 C 的产品,C 将产品委托给 代理商 B ,B 在给 A 使用之前可以先进行一些操作
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogHandler implements InvocationHandler {
// 用于存储 需要被代理的类的实例,用于 method.invoke 方法执行需要一个具体实例
Object targerObject;
public Object newProxyInstance(Object object){
this.targerObject=object;
//返回一个 类的代理类实例
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}
//代理类在执行任何方法的时候,都会转到 invoke 函数
@Override
public Object invoke(Object object, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("start-log ");
Object returnObj;
returnObj=method.invoke(targerObject, args);
System.out.println("end -log ");
return returnObj;
}
}
package test;
public interface UserManager {
public void addUser();
public String findUser();
}
代理类 代理的类(UserManagerImpl),必须有实现接口
package test;
public class UserManagerImpl implements UserManager {
@Override
public void addUser() {
// TODO Auto-generated method stub
System.out.println("add User !");
}
@Override
public String findUser() {
System.out.println("find User !");
return "User A !";
}
public static void main(String[] args) {
LogHandler logHandler=new LogHandler();
UserManager userManager=(UserManager)logHandler.newProxyInstance(new UserManagerImpl());
String str=userManager.findUser();
System.out.println(str);
}
}
网友评论