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
相关推荐
3. 字节码生成:Javassist提供了一系列API,可以方便地生成新的类和方法的字节码。这些API类似于Java源代码的构造,使得生成字节码的过程更加直观和简洁。 4. AOP支持:面向切面编程是一种编程范式,用于解耦关注点...
3. **字节码生成**: 当我们使用javac命令编译Java源代码时,Java编译器会生成.class文件,每个文件包含一个或多个类或接口的字节码。字节码文件结构包括魔术数字、版本信息、常量池、访问标志、类索引、父类索引、...
Java注解、反射、字节码和类加载机制是Java编程中的核心概念,它们在实际开发中扮演着重要角色。让我们深入探讨这些知识点。 **Java注解(Annotation)**: Java注解是一种元数据,它提供了在编译时或运行时处理代码的...
hp-reflect 是一款基于Java字节码技术的高效反射工具,其设计源码包含31个文件,其中Java源文件21个,辅助文件包括备份文件、Git忽略规则、许可证、文档、XML配置等。该工具通过动态生成access class,实现高效的...
为了修改字节码,我们可能需要先将.dex文件解压到文件系统,然后使用如dexlib、dx工具或者Android Studio的Gradle插件进行修改。修改完成后,再重新打包并替换原.dex文件,最后通过反射或其他机制触发重新加载。 3....
2. **字节码生成**:通过BCEL,开发者可以创建新的类、接口或方法,或者修改现有的字节码。BCEL提供了诸如`Instruction`、`InstructionList`和`MethodGen`等类,用于构建和操作字节码序列。 3. **类与方法的反射**...
6. **反射信息**:Java字节码也记录了类、方法和字段的反射信息,这对于动态绑定和运行时代码修改非常有用。 7. **数据流和控制流分析**:通过深入分析字节码,可以构建数据流图和控制流图,进一步了解程序的执行...
反射工具包,利用反射的API直接生成Java字节码,提高执行效率。 ###普通方法调用 所有的命令最终生成到Invoker对象的invoke方法中 public Object invoke(Object[] args); 具体使用如下: InvokerBuilder builder=...
10. **自动化脚本和工具**:工具包可能提供自动化脚本,帮助用户快速生成和测试免杀的恶意软件,如批量修改特征码、混淆代码等。 在了解这些知识点的同时,我们也要认识到,使用免杀工具违反了网络安全法规,可能...
通过使用字节码操作库(如Java的ASM或C#的Mono.Cecil),我们可以在字节码级别生成和修改代码,这提供了比反射更底层的控制。 3. **动态语言支持**:某些语言如Python和Ruby天生支持动态代码生成。这些语言的解释器...
总结来说,Teavm是一个强大的工具,它开启了Java开发者在Web前端的新可能性,通过将Java字节码转换为JavaScript,让Java应用程序能在浏览器环境中运行。它的高性能、广泛的Java支持和跨平台能力使其成为Java Web开发...
Cglib为开发者提供了更高级别的抽象,使得字节码操作更加简便,而ASM则提供了更为底层和灵活的字节码生成和分析功能。因此,Cglib能够利用ASM的强大功能,同时为开发者提供了一个易于使用的接口。 在实际项目中,...
这个项目的实现可能涉及到反射、ASM库(一个用于生成和修改Java字节码的库)或者自定义的类加载器。通过这些技术,它可以动态地生成、分析甚至修改Java类的字节码,并将其转化为JSON对象。这为API开发带来了一种新的...
**ASM-ANALYSIS**是分析工具包,包含了一些用于字节码分析的工具和类。它可以用于检测代码质量、查找潜在的错误或性能瓶颈,例如检查空指针异常的可能性、分析控制流图(CFG)以理解程序的执行路径,或者进行数据流...
1. **字节码生成**:展示如何使用Java反射API或其他工具生成自定义字节码,例如使用ASM、BCEL或Javassist库。 2. **字节码分析**:包含用于查看和理解字节码的工具,如javap命令,它能反汇编.class文件,展示方法的...
ASM库可以让你以非常低级的方式访问和修改类的字节码,这对于理解Java类的工作原理、编写Java字节码生成器或者实现自定义的字节码操作来说非常有用。在Spring MVC的开发过程中,ASM库可能被用来进行AOP(面向切面...
CGlib并不是独立存在的,它依赖于ASM库来处理字节码生成,而ASM-commons和asm-util则是ASM库的扩展,提供了更多实用功能。 CGlib的工作原理基于Java的反射机制和字节码操作。当目标类不支持接口时,CGlib可以创建...
2. **字节码生成**:在解析了字节码之后,ASM也允许用户生成新的字节码,或者修改已有的字节码。这对于动态代理、AOP(面向切面编程)等场景非常有用。 3. **API设计**:ASM提供了一套简洁而强大的API,包括Class...
另外,字节码操作库如ASM、CGLIB和ByteBuddy则可以用于动态生成或修改类的字节码,常用于AOP框架和性能优化。 4. **HTTP通信**: 在Java中,处理HTTP请求和响应最常用的是`java.net.HttpURLConnection`,它是Java...
- Java反编译技术:如何将字节码反编译成Java源代码,理解JAD、FernFlower等反编译器的工作原理。 - 类加载器与反射机制:理解Java如何加载类,以及如何通过反射机制动态操作类和对象。 - 数据库交互:kxmall作为...