您好,欢迎来到尔游网。
搜索
您的当前位置:首页【JavaSec】JDK动态代理初探

【JavaSec】JDK动态代理初探

来源:尔游网

JDK动态代理初探

  • 静态代理

用户接口:

public interface IUser {
    void show();

    void create();

    void update();
}

用户实现类:

/**
 * 实现类
 */

public class UserImpl implements IUser{
    public UserImpl(){

    }

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

    @Override
    public void create() {
        System.out.println("执行 => 创建");
    }

    @Override
    public void update() {
        System.out.println("执行 => 更新");
    }


}

Proxy:

import java.lang.reflect.Method;

/**
 * 静态代理 实现IUser接口
 * 起到通过代理 有日志记录的功能
 */
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("Proxy:调用 => show");
    }

    @Override
    public void create() {
        user.create();
        System.out.println("Proxy:调用 => create");
    }

    @Override
    public void update() {
        user.update();
        System.out.println("Proxy:调用 => update");
    }
}

测试类:

import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args){

        //创建一个对象  用接口效果一样 继承关系
        IUser  user = new UserImpl();
//        user.show();  无代理 直接访问
        //上代理  通过代理的好处 相当于租房找中介  有过程日志记录
        //静态代理
        IUser userProxy = new UserProxy(user);
        userProxy.show();
        userProxy.update();
        userProxy.create();
    }
}

效果:

但是我们可以发现,上面的这种如果想对所有方法都进行代理,其实非常麻烦,每个函数方法都得写一遍

所以引出动态代理,可以自动找到对应的方法 不用重写了

  • 动态代理

ProxyTest:

//动态代理
//新建一个动态代理类  参数:要代理的接口、要做的事情、类加载器classloader
InvocationHandler userinvocationHandler = new UserInvocationHandler(user);
IUser userActiveProxy = (IUser) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), userinvocationHandler);

userActiveProxy.create();

userinvocationHandler:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

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);   // 接收到方法  利用invoke函数调用  参数时对象 和对应的方法值
        return null;
    }
}

可以成功执行方法

但是没有 实现日志的效果 加一句话就ok了

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- axer.cn 版权所有 湘ICP备2023022495号-12

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务