JDK动态代理

Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface的实例。SpringAOP的实现机制就是依靠动态代理机制实现。动态代理实际上是JVM在运行期动态创建class字节码并加载的过程,而不需要改动源代码

步骤一:创建接口

 相关的类

public class User {

    public String name;
    public int age;


    public User(String name,int age){
       this. name=name;
       this.age=age;
    }

    public User(){}

}
public interface IUser {

    /**
     * 打印用户信息
     * @param user
     */
    void print(User user);

    /**
     * 打印数字信息
     * @param num
     */
    void print(int num);
}

步骤二:实现接口

public class IUserImpl implements IUser {

    @Override
    public void print(User user) {
        System.out.println(user.name+"\n"+user.age);
    }

    @Override
    public void print(int num) {
        System.out.println(num);
    }
}

步骤三:动态增强IUserImpl中的print(User user)方法

public class DynamiProxy {

    public static void main(String[] args) {
        Class[] objects=new  Class[]{IUser.class};

        IUserImpl impl=new IUserImpl();

        /**
         * 生成动态代理类
         */
        IUser proxy=(IUser) Proxy.newProxyInstance(IUser.class.getClassLoader(),objects,new MyInnocationHandler(impl));

        User user=new User("lily",19);
        proxy.print(user);

        int num=19;
        proxy.print(num);

    }



}


/**
 * 动态代理增强的处理逻辑
 */
class  MyInnocationHandler implements InvocationHandler {

    Object object;
    //构造函数传入需要被代理的类
    public  MyInnocationHandler(Object object){

        this.object=object;
    }

    //传入代理对象
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //是否要执行增强逻辑,默认为false,默认不需要增强原方法
        boolean flag=false;
        //获得方法名
        String name = method.getName();
        //参数列表
        Parameter[] parameters = method.getParameters();
        //参数个数
        int count=method.getParameterCount();
        if("print".equals(name)&&count==1){
            for(Parameter parameter:parameters){
                if(parameter.getParameterizedType().getTypeName().equals("designPattern.User")){
                    flag=true;
                }
            }
        }


        if(flag){
            //执行前逻辑
            System.out.println("打印用户的方法执行前");
            Object invoke = method.invoke(object, args);
            //执行后逻辑
            System.out.println("打印用户的方法执行后");
            return invoke;
        }else{
            Object invoke = method.invoke(object, args);
            return invoke;
        }


    }
}

 根据代码分析,当执行方法名称为print,且满足参数个数为一,参数类型匹配 

designPattern.User【需要考虑实际项目的参数类型,当前仅供参考】时

将会执行增强方法,在原方法的前后执行相应的逻辑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值