Method.invoke与MethodAccess.invoke的区别

来源:互联网 发布:网站用户数据分析 编辑:程序博客网 时间:2024/05/22 12:42

本篇文章主要介绍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


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

原创粉丝点击