Method.invoke与MethodAccess.invoke的区别

本篇文章主要介绍java.reflect.Method与com.esotericsoftware.reflectasm.MethodAccess的区别。不多说,先贴上代码。

package org;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotations.TableField;
import com.esotericsoftware.reflectasm.MethodAccess;
import org.ibase4j.core.base.BaseModel;
import org.springframework.data.annotation.Transient;


import java.lang.reflect.Method;


/**
 * reflect compare
 *
 * @author linchuangang
 * @create 2017-09-13 14:23
 **/
public class MethodInvoke extends BaseModel {
    private int a;

    private static int b =2;

    private transient int c;

    @Transient
    private int d;

    @TableField(exist = false)
    private int e;

    @TableField("f_")
    private int f;
    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public static int getB() {
        return b;
    }

    public static void setB(int b) {
        MethodInvoke.b = b;
    }

    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }

    public int getD() {
        return d;
    }

    public void setD(int d) {
        this.d = d;
    }

    public int getE() {
        return e;
    }

    public void setE(int e) {
        this.e = e;
    }

    public int getF() {
        return f;
    }

    public void setF(int f) {
        this.f = f;
    }

    public MethodInvoke(int a, int c, int d, int e,int f) {
        this.a = a;
        this.c = c;
        this.d = d;
        this.e = e;
        this.f = f;
    }

    public void prints(BaseModel baseModel){
        System.out.println(JSON.toJSONString(baseModel));
    }
    public void print(int a){}
    public void print(int a,int b){}
    public void print(int a,byte b){}
    public void print(int a,byte[]b){}
    public void print(int a,float b){}
    public void print(int a,double b){}
    public void print(int a,boolean b){}
    public void print(int a,Object b){}
    public void print(int a,int[]i){}
    public static void main(String[]args)throws Exception{
        MethodInvoke invoke = new MethodInvoke(1,3,4,5,6);
        //id为父类的属性
        invoke.setId(System.currentTimeMillis());
        Long a = System.currentTimeMillis();
        MethodAccess access = MethodAccess.get(invoke.getClass());
        access.invoke(invoke,"prints",invoke);
        Long b = System.currentTimeMillis();
        System.out.println("MethodAccess use:"+(b-a)+"ms");
        Long c = System.currentTimeMillis();
        Method method = invoke.getClass().getMethod("prints", BaseModel.class);
        method.invoke(invoke,invoke);
        Long d = System.currentTimeMillis();
        System.out.println("first,java.reflect.Method use:"+(d-c)+"ms");
        c = System.currentTimeMillis();
        Method method1 = invoke.getClass().getMethod("prints", BaseModel.class);
        method.invoke(invoke,invoke);
        d = System.currentTimeMillis();
        System.out.println("twice,java.reflect.Method use:"+(d-c)+"ms");
    }
}

代码运行结果:

{"a":1,"d":4,"e":5,"f":6,"id":1505288185633}
MethodAccess use:206ms
{"a":1,"d":4,"e":5,"f":6,"id":1505288185633}
first,java.reflect.Method use:0ms
{"a":1,"d":4,"e":5,"f":6,"id":1505288185633}
twice,java.reflect.Method use:0ms

注释掉MethodAccess的invoke方法后,运行结果:

{"a":1,"d":4,"e":5,"f":6,"id":1505288412911}
first,java.reflect.Method use:193ms
{"a":1,"d":4,"e":5,"f":6,"id":1505288412911}
twice,java.reflect.Method use:0ms


至于过程解释,找时间再来更新

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值