Java动态代理

静态代理

例如又一个房东 可以收房租 有一个代理是中介 可以直接交房租给房东 也可以交房租给中介 但是在交给中介前或者交给中介后可以进行其他操作 定义一个IUser接口 Iuser.java

public interface IUser {
    void show();
}

Iuser的实现类 UserImpl.java

public class UserImpl implements IUser{
    public UserImpl(){

    }
    @Override
    public void show() {
        System.out.println("展示");
    }
}

创建一个代理类

public class UserProxy implements IUser{
    IUser user;
    public UserProxy(){}

    public UserProxy(IUser user){
        this.user = user;
    }
    @Override
    public void show() {
        user.show();
        System.out.println("调用了show");
    }
}

然后通过调用代理类去调用user的show方法

public class ProxyTest {
    public static void main(String[] args){
        IUser user = new UserImpl();
        IUser userProxy = new UserProxy(user);
        userProxy.show();

    }
}

运行 file

动态代理

如果使用静态代理 那么假如IUser中有很多方法 对应的代理类里边也要相应的写上对应的方法 无疑增加了代码量 动态代理实现了 通过反射去调用代理类的方法 创建一个UserInvocationHandler.java类 继承InvocationHandler接口

public class UserInvocationHandler implements InvocationHandler {
    IUser user;
    public UserInvocationHandler(){}
    public UserInvocationHandler(IUser user){
        this.user = user;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(user,args);
        System.out.println("调用了"+method.getName());
        return null;
    }
}

测试

public class ProxyTest {
    public static void main(String[] args){
        IUser user = new UserImpl();

        //动态代理
        UserInvocationHandler userInvocationHandler = new UserInvocationHandler(user);
        IUser userProxy = (IUser)
        //代理对象的每个执行方法都会替换执行Invocation中的invoke方法
        Proxy.newProxyInstance(user.getClass().getClassLoader(),user.getClass().getInterfaces(),userInvocationHandler);
        userProxy.show();
    }
}

Java动态代理
http://example.com/2021/09/12/OldBlog/java动态代理/
作者
Autumn
发布于
2021年9月12日
许可协议