`
liwei113114
  • 浏览: 14376 次
  • 性别: 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

分享到:
评论

相关推荐

    javassist,Java字节码工程工具包.zip

    3. 字节码生成:Javassist提供了一系列API,可以方便地生成新的类和方法的字节码。这些API类似于Java源代码的构造,使得生成字节码的过程更加直观和简洁。 4. AOP支持:面向切面编程是一种编程范式,用于解耦关注点...

    字节码实战包含class,字节码.zip

    3. **字节码生成**: 当我们使用javac命令编译Java源代码时,Java编译器会生成.class文件,每个文件包含一个或多个类或接口的字节码。字节码文件结构包括魔术数字、版本信息、常量池、访问标志、类索引、父类索引、...

    java注解_反射_字节码_类加载机制.zip

    Java注解、反射、字节码和类加载机制是Java编程中的核心概念,它们在实际开发中扮演着重要角色。让我们深入探讨这些知识点。 **Java注解(Annotation)**: Java注解是一种元数据,它提供了在编译时或运行时处理代码的...

    基于Java字节码技术的高性能hp-reflect反射工具设计源码

    hp-reflect 是一款基于Java字节码技术的高效反射工具,其设计源码包含31个文件,其中Java源文件21个,辅助文件包括备份文件、Git忽略规则、许可证、文档、XML配置等。该工具通过动态生成access class,实现高效的...

    Android中修改运行时内存Dalvik字节码

    为了修改字节码,我们可能需要先将.dex文件解压到文件系统,然后使用如dexlib、dx工具或者Android Studio的Gradle插件进行修改。修改完成后,再重新打包并替换原.dex文件,最后通过反射或其他机制触发重新加载。 3....

    基于Java的字节码操作库 BCEL.zip

    2. **字节码生成**:通过BCEL,开发者可以创建新的类、接口或方法,或者修改现有的字节码。BCEL提供了诸如`Instruction`、`InstructionList`和`MethodGen`等类,用于构建和操作字节码序列。 3. **类与方法的反射**...

    一种基于Java字节码的软件设计信息提取方法.zip

    6. **反射信息**:Java字节码也记录了类、方法和字段的反射信息,这对于动态绑定和运行时代码修改非常有用。 7. **数据流和控制流分析**:通过深入分析字节码,可以构建数据流图和控制流图,进一步了解程序的执行...

    ReflectionUtil:反射工具包

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

    2010最新免杀工具包。。。。

    10. **自动化脚本和工具**:工具包可能提供自动化脚本,帮助用户快速生成和测试免杀的恶意软件,如批量修改特征码、混淆代码等。 在了解这些知识点的同时,我们也要认识到,使用免杀工具违反了网络安全法规,可能...

    手工代码生成原理视频

    通过使用字节码操作库(如Java的ASM或C#的Mono.Cecil),我们可以在字节码级别生成和修改代码,这提供了比反射更底层的控制。 3. **动态语言支持**:某些语言如Python和Ruby天生支持动态代码生成。这些语言的解释器...

    teavm,java字节码到javascript的编译.zip

    总结来说,Teavm是一个强大的工具,它开启了Java开发者在Web前端的新可能性,通过将Java字节码转换为JavaScript,让Java应用程序能在浏览器环境中运行。它的高性能、广泛的Java支持和跨平台能力使其成为Java Web开发...

    Cglib和asm的jar包

    Cglib为开发者提供了更高级别的抽象,使得字节码操作更加简便,而ASM则提供了更为底层和灵活的字节码生成和分析功能。因此,Cglib能够利用ASM的强大功能,同时为开发者提供了一个易于使用的接口。 在实际项目中,...

    animated-octo-meme:用于生成 API 的 Java 字节码的 json 表示的工具

    这个项目的实现可能涉及到反射、ASM库(一个用于生成和修改Java字节码的库)或者自定义的类加载器。通过这些技术,它可以动态地生成、分析甚至修改Java类的字节码,并将其转化为JSON对象。这为API开发带来了一种新的...

    asm 6.0 工具集

    **ASM-ANALYSIS**是分析工具包,包含了一些用于字节码分析的工具和类。它可以用于检测代码质量、查找潜在的错误或性能瓶颈,例如检查空指针异常的可能性、分析控制流图(CFG)以理解程序的执行路径,或者进行数据流...

    bytecode-basics:“JVM 字节码简介”会话的源代码

    1. **字节码生成**:展示如何使用Java反射API或其他工具生成自定义字节码,例如使用ASM、BCEL或Javassist库。 2. **字节码分析**:包含用于查看和理解字节码的工具,如javap命令,它能反汇编.class文件,展示方法的...

    asm-3.3.1.jar

    ASM库可以让你以非常低级的方式访问和修改类的字节码,这对于理解Java类的工作原理、编写Java字节码生成器或者实现自定义的字节码操作来说非常有用。在Spring MVC的开发过程中,ASM库可能被用来进行AOP(面向切面...

    cglib动态代理jar包

    CGlib并不是独立存在的,它依赖于ASM库来处理字节码生成,而ASM-commons和asm-util则是ASM库的扩展,提供了更多实用功能。 CGlib的工作原理基于Java的反射机制和字节码操作。当目标类不支持接口时,CGlib可以创建...

    asm-4.0_RC1.jar.zip

    2. **字节码生成**:在解析了字节码之后,ASM也允许用户生成新的字节码,或者修改已有的字节码。这对于动态代理、AOP(面向切面编程)等场景非常有用。 3. **API设计**:ASM提供了一套简洁而强大的API,包括Class...

    Java开发工具包(数据校验,数据脱敏,类处理,Http等.....)

    另外,字节码操作库如ASM、CGLIB和ByteBuddy则可以用于动态生成或修改类的字节码,常用于AOP框架和性能优化。 4. **HTTP通信**: 在Java中,处理HTTP请求和响应最常用的是`java.net.HttpURLConnection`,它是Java...

    kxmall逆向生成工具

    - Java反编译技术:如何将字节码反编译成Java源代码,理解JAD、FernFlower等反编译器的工作原理。 - 类加载器与反射机制:理解Java如何加载类,以及如何通过反射机制动态操作类和对象。 - 数据库交互:kxmall作为...

Global site tag (gtag.js) - Google Analytics