假设我想获取一个java类文件,反汇编它,调整java字节码输出,然后再重新组装它.
我需要重命名常量池表中的符号.我也无法访问源代码,使用反编译器似乎有点过分.我不是想优化任何东西 - java在那方面做得很好.
有......一个简单的方法吗?我找到了几种用于拆卸或重新组装的工具,但两者都没有; 或者没有一对工具似乎使用相同的格式来表示文本中的字节码.
对于java中的字节码检测,有asm框架和bcel和javaassist库.
但是我需要在本机代码中进行检测,因为javaagent运行时已经加载了一些java类,例如java.lang.Thread,java.lang.Class等.
是否有任何库用于在本机代码中检测java类?
编辑:似乎有点混乱.
我想要的是:创建一个本机java代理,它使用JVMTI apis在加载类时使用OnClassLoad事件挂钩更改类的字节码.
我有一个使用javac/aspectj编译器编译的maven项目.
我想在编译javassist程序的类上运行,该程序操作编译的类并向其添加内容.
我想使用"进程类"阶段来运行我的工具.
我的问题是在"target/classes"中创建的类文件上使用javassist进行迭代的最佳方法是什么,以便我可以在之后加载,修复和保存.
另一个要求是在测试类上运行该工具.
如果有一个开源项目做类似的事情,那么很高兴看到一个实例.
谢谢,
Avner
java bytecode-manipulation maven annotation-processing javassist
JSR 308建议向Java添加类型注释.在批准之后,程序员将能够在当前允许Java类型的任何地方添加注释.这不仅包括方法/字段/本地/参数装饰,还包括构造函数调用,类型转换以及最奇怪的实例检查.所述检查器框架使用JSR 308来实现类型限定符像@NonNull上的对象类型,或@Regex对字符串.
现在,Checkers所做的就是静态分析你的代码.那是所有编译时间检查.没关系.但我想要的是一种可以在运行时进行检查的机制.你可以声明:
@Regex String p1 = "[a-z]+";
@Regex String p1 = "[a-z)+"; // compile time error from annotation processor
Run Code Online (Sandbox Code Playgroud)
我也可以写:
if (x instanceof @Regex String) ...
Run Code Online (Sandbox Code Playgroud)
但这没有什么不同x instanceof String,没有执行运行时检查.我需要一个编译时注释处理器或运行时字节码操纵器,它允许我在instanceof检查上运行任意代码并返回一个布尔值.这可能与Java有关吗?
java code-generation annotations bytecode-manipulation annotation-processing
所以这是一个例子:
LocalVariableTable:
Start Length Slot Name Signature
0 133 0 this Lcom/my/class/Test;
2 131 1 a I
4 129 2 b I
7 126 3 i I
10 123 4 i2 I
16 117 5 o1 Ljava/lang/Integer;
31 102 6 o2 Ljava/lang/Integer;
Run Code Online (Sandbox Code Playgroud)
start和length是什么意思?为什么长度具有它的价值?为什么相同类型(整数)的长度不同?为什么长度可以更改,当我向类添加一些内容并重新编译它而不触及该特定的局部变量?
我刚开始使用Lombok通过修改其引导类路径在我的本地Eclipse环境中为Java bean自动生成getter和setter的能力:
-vmargs -javaagent:lombok.jar -Xbootclasspath/a:lombok.jar
Run Code Online (Sandbox Code Playgroud)
它在本地工作正常,但是由于我们的应用程序生命周期需要Jenkins构建,我对@Getter和@Setter注释在我们的CI环境中运行时对代码的影响方式有点怀疑.
到目前为止,Lombok触及我们的域层,因为我们使用其他框架,这些框架依赖于在运行时在模型上设置getter/setter以使它们工作,我想更全面地了解Lombok的字节码修改是如何在我完全完成之前完成的.承诺使用它.
这些注释自动生成的所有方法是否都可以在Jenkins中使用,只是因为在pom.xml文件中具有Lombok的依赖性,或者我还需要修改整个Jenkins的启动脚本,如上所述.或者只是Jenkins的工作需要以某种方式修改以包含Lombok的字节码修改行为?
如果有人尝试并成功将Lombok与Jenkins CI合并,我将愿意听取他们的经验并将其融入我们的DevOps流程中.
先感谢您.
continuous-integration bytecode-manipulation lombok jenkins devops
我上课了
class Foo {
int increment(int x) {
return x + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
我想在运行时获取此类的副本,例如类
class Foo$Copy1 {
int increment(int x) {
return x + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
其中包含所有相同的方法,但名称不同.
Proxy似乎有助于委派,但不是用他们所有的身体复制方法.
有没有办法修改.class文件以便为某些方法添加Java注释?基本上我想遍历jar文件中的每个类文件的方法并注释某些类文件.请注意,在使用jar文件时,这不是在运行时.相反,在我完成之后,我想要使用注释修改类文件.
我有权访问源代码,所以如果有一个自动源代码修饰符,那也可以...
我有一个旧库(大约 2005 年),它执行字节码操作,但不涉及堆栈图。因此,我的 jvm (java 8) 抱怨它们是无效的类。规避错误的唯一方法是使用-noverify. 但这对我来说不是一个长期的解决方案。
在类已经生成之后,有什么办法可以重新生成堆栈映射吗?我看到ClassWriter该类有一个选项来重新生成堆栈映射,但我不确定如何读取字节类并重写一个新的。那可行吗?
好吧,我发布这个是担心它可能会在任何人阅读它之前被关闭 - 我已经习惯了 - 但我会尝试一下......甚至指出我正确的方向或一些现有的答案确实包含一个特定的答案肯定会...
所以,在这个简短的介绍之后......我目前正在为我设计的编程语言编写一个字节码解释器,在C 中,(基于堆栈的 VM)。
如果您想查看支持的操作码,请随时在此处查看:https : //github.com/arturo-lang/arturo/blob/master/src/vm/opcodes.h
堆栈机并没有什么特别之处。值被压入和弹出,操作符和函数处理它们,将计算结果推回堆栈。到现在为止还挺好。
现在,我正处于所有核心功能所在的地步,我正在尝试通过进一步优化来进一步提升它。
这是一个例子(希望是一个相当说明性的例子)。
输入:
fibo: $(x){
if x<2 {
return 1
} {
return [fibo x-1] + [fibo x-2]
}
}
i: 0
loop i<34 {
print "fibo(" + i + ") = " + [fibo i]
i: i+1
}
Run Code Online (Sandbox Code Playgroud)
产生的字节码:
|== Data Segment /======================>
0 : [Func ]= function <5,1>
1 : [Int ]= 34
2 : [String]= fibo(
3 …Run Code Online (Sandbox Code Playgroud) c programming-languages bytecode bytecode-manipulation compiler-optimization