jdk动态代理
通过代码来看动态代理
当我不想改变UserServiceImpl的代码,还想堆UserServiceImpl进行增强加入日志方法时,就可以采用动态代理的模式。
public interface UserService {
void add();
void update();
void delete();
}
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("add方法");
}
@Override
public void update() {
System.out.println("update方法");
}
@Override
public void delete() {
System.out.println("delete方法");
}
}
public class MyProxy implements InvocationHandler {
//被代理的角色
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//动态生成代理类
public Object getObject(){
return Proxy.newProxyInstance(
this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//处理代理实例。并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object o = method.invoke(target, args);
return o;
}
public void log(String methodName){
System.out.println(methodName+"日志");
}
}
public class MainStart {
public static void main(String[] args) {
//真实角色,被代理角色
UserServiceImpl userServiceImpl=new UserServiceImpl();
//代理角色
MyProxy myProxy=new MyProxy();
myProxy.setTarget(userServiceImpl);//设置被代理的对象
//动态生成代理类
UserService userService =(UserService) myProxy.getObject();
userService.add();
}
}
运行结果: