欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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()调用处理程序,并返回结果的

动态代理的优点:
一个动态代理可以代理多个类,只要是实现同一个接口

Java 静态代理和动态代理
Java 静态代理和动态代理

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("收中介费");
}

}

Java 静态代理和动态代理