`
liwei113114
  • 浏览: 13925 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

反射工具包(字节码生成)

阅读更多

 

 

ReflectionUtil

反射工具包,利用反射的API直接生成Java字节码,提高执行效率。

普通方法调用

所有的命令最终生成到Invoker对象的invoke方法中

public Object invoke(Object[] args);

 

具体使用如下:

InvokerBuilder builder=InvokerBuilder.getInstance();
Method concat = String.class.getMethod("concat", new Class[]{String.class});
Method println = PrintStream.class.getMethod("println", new Class[]{String.class});
builder.constant("hello") //定义常量
        .store("end") //赋值给变量end 以上两句相当于String end = "hello"
        .methodInvoke(concat, Ops.$(0), Ops.v("end")) //调用invoke方法参数数组中的第0个值的concat方法,参数为变量end
    .store("tt")//将以上方法的返回值赋值给tt
    .staticField(System.class, "out") //获取System.out对象
    .constant("hello world!") //定义常量
    .methodInvoke(println)  //调用Sytem.out的println对象
    .ret("tt"); //返回tt

 

以上的所有操作,相当于直接编写以下代码

public class Generate$2055281021
  implements Invoker
{
  public Object invoke(Object[] paramArrayOfObject)
  {
    String str1 = "hello";
    String str2 = ((String)paramArrayOfObject[0]).concat(str1);
    System.out.println("hello world!");
    return str2;
  }
}

 

 

创建对象

直接调用new创建 具体代码如下:

InvokerBuilder builder=InvokerBuilder.getInstance();
Constructor<StringBuilder> init=StringBuilder.class.getConstructor(String.class);
Method append = StringBuilder.class.getMethod("append", String.class);
Method toString=Object.class.getMethod("toString", new Class[]{});
builder.constant("hello") //定义常量
    .store("a") //赋值给变量a
    .newInstance(StringBuilder.class, init,Ops.v("a")) //调用new指令,创建对象同时调用构造函数
    .store("sb")//赋值给sb变量
    .constant("world")//定义常量"world"
    .store("t") //赋值给变量t
    .methodInvoke(append, Ops.v("sb"), Ops.v("t")) //调用append方法
    .methodInvoke(toString) //调用toString
    .ret();  //返回以上调用的结果

 


以上所有操作相当于直接编写以下代码:

public class Generate$918221580
  implements Invoker
{
  public Object invoke(Object[] paramArrayOfObject)
  {
    String str1 = "hello";
    StringBuilder localStringBuilder = new StringBuilder(str1);
    String str2 = "world";
    return localStringBuilder.append(str2).toString();
  }
}

 

注意:在调用newInstance时,会同时调用构造方法和dup指令(将新对象的引用复制一份到栈顶),如果仅仅是调用构造方法而不使用新生成的对象(复制或作为方法的参数等),在调用完newInstance后要执行pop操作。

dump及写文件

编写完所有指令后,可以将字节码dump成jvm指令或写入文件中。使用如下:

InvokerBuilder builder=InvokerBuilder.getInstance();
Method concat = String.class.getMethod("concat", new Class[]{String.class});
builder.constant("hello").constant("world").methodInvoke(concat).ret();
ByteArrayOutputStream bos=new ByteArrayOutputStream();
builder.dump(bos);
System.out.println(new String(bos.toByteArray()));
builder.store2file("d:/tt/ttt1.class");

 

输出如下:

public class org.cc.Generate$918221580 extends java.lang.Object implements org.cc.common.reflection.core.Invoker{
public org.cc.Generate$918221580();
  Code:
   0:   aload_0
   1:   invokespecial   #10; //Method java/lang/Object."<init>":()V
   4:   return

public java.lang.Object invoke(java.lang.Object[]);
  Code:
   0:   ldc #14; //String hello
   2:   ldc #16; //String world
   4:   invokevirtual   #22; //Method java/lang/String.concat:(Ljava/lang/String;)Ljava/lang/String;
   7:   areturn
}

 

github地址:https://github.com/DreamLee471/ReflectionUtil

更多使用参见sample

有任何疑问可直接发邮件到dreamlee471@gmail.com

分享到:
评论

相关推荐

    ReflectionUtil:反射工具包

    反射工具包,利用反射的API直接生成Java字节码,提高执行效率。 ###普通方法调用 所有的命令最终生成到Invoker对象的invoke方法中 public Object invoke(Object[] args); 具体使用如下: InvokerBuilder builder=...

    Java中的反射

     .java文件 通过 javac编译工具生成对应的.class字节码文件  使用JDK中提供的反编译工具,可以看到.class文件中包含  Class 完整的包名.类名  Field 成员变量,成员变量的名字和成员变量的数据类型[如果是引用...

    Java.反射

    .java文件通过javac编译工具生成对应的.class字节码文件。使用JDK中提供的反编译工具可以看到.class文件中包含 Class 完整的包名.类名 Field 成员变量,成员变量的名字和成员变量的数据类型(如果是引用数据类型,...

    Java知识点——反射初识以及基本API

    .java文件 通过 javac编译工具生成对应的.class字节码文件 使用JDK中提供的反编译工具,可以看到.class文件中包含 Class 完整的包名.类名 Field 成员变量,成员变量的名字和成员变量的数据类型[如果是引用数据类型,...

    2023java最新学习路线.docx

    3. 反射和字节码操作:学习使用Java的反射机制和字节码操作库,实现动态代理、代码生成和运行时修改类的功能。 4. 函数式编程:学习Java 8及更高版本引入的函数式编程特性,如Lambda表达式和Stream API,提升代码...

    Day 24反射

    .java文件通过javac编译工具生成对应的.class字节码文件 包含 Class 完整的包名,类名 Field 成员变量 Method 成员方法 1.2 程序加载过程和.class文件的关系 在Java文件运行过程中,当前程序需要哪一个...

    java–反射

    .java文件 通过 javac编译工具生成对应的.class字节码文件,使用JDK中提供的反编译工具,可以看到.class文件中包含  Class 完整的包名.类名  Field 成员变量,成员变量的名字和成员变量的数据类型[如果是引用数据...

    Java中的反射(一)

    .java文件通过 javac编译工具生成对应的.class字节码文件 使用JDK中提供的反编译工具,可以看到.class文件中包含有: Class 完整的包名.类名 Field 成员变量,成员变量的名字和成员变量的数据类型(如果为引用数据...

    Java中不明白的小知识–反射

    .class字节码问题:.Java文件通过Javac编译工具生成对应的.class字节码文件,使用JDK中提供的反编译工具,可以看到.class文件中包含class完整的包名.类名。 Filed成员变量,成员变量的名字和成员变量的数据类型[如果...

    SM2 SM3 X.509 Cert 国密 数字签名 算法 国密证书 生成 签发 证书请求 keystore 纯java.zip

    可移植性:Java字节码可以在所有安装了JVM的设备上执行,从服务器到嵌入式系统,再到移动设备和桌面应用。 健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能...

    JAVA_API1.6文档(中文)

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    java api最新7.0

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...

    Java 1.6 API 中文 New

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...

    day020-继承加强和设计模式代码和笔记.rar

    什么是jar包:就是别人封装好的字节码文件 2. 作用:就是提高开发效率的。使用轮子 3. 使用: 3.1 使用别人写好的jar包 step1:在当前项目下,创建一文件夹folder,叫lib step2:将jar包复制到当前...

    [Java参考文档].JDK_API 1.6

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...

    JavaAPI1.6中文chm文档 part1

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    JavaAPI中文chm文档 part2

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    [Java参考文档]

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

Global site tag (gtag.js) - Google Analytics