Java 静态代理和动态代理
程序员文章站
2022-06-17 19:57:26
...
静态代理的缺点:
一个真实角色就会产生一个代理角色;代码量会翻倍-开发效率会降低
真实对象:
代理对象:(其实就是有一个私有属性为:真实对象,这样就可以调用真是对象的方法
,然后有个一个带参构造方法,参数为真是对象,也可以不要这个构造方法,用set方法代替,在加上一新的功能方法,比如这里的log()方法,再在原有的方法中加上这个新的功能方法,也就达到了效果)
public class UserServiceProxy implements UserService {
private UserServiceImpl userService;
// public void setUserService(UserServiceImpl userService) {
// this.userService = userService;
// }
public UserServiceProxy(UserServiceImpl userService){
this.userService = userService;
}
@Override
public void add() {
log("add");
userService.add();
}
@Override
public void delete() {
log("delete");
userService.delete();
}
@Override
public void update() {
log("update");
userService.update();
}
@Override
public void query() {
log("query");
userService.query();
}
public void log(String msg){
System.out.println("debug了"+msg);
}
}
这就是静态代理:(感觉代码增加了很多,建议使用动态代理)
动态代理:
基于接口的动态代理
需要了解两个类:proxy 提供了创建动态代理类和实例的静态方法,生成代理实例的
InvocationHandler()调用处理程序,并返回结果的
动态代理的优点:
一个动态代理可以代理多个类,只要是实现同一个接口
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}
// public ProxyInvocationHandler(Rent rent) {
// this.rent = rent;
// }
//生成都得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
}
//处理代理实例,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seeHouse();
Object result = method.invoke(rent, args);
fare();
return result;
}
public void seeHouse(){
System.out.println("中介带看房子");
}
public void fare(){
System.out.println("收中介费");
}
}