草庐IT

Bytecode

全部标签

Java ASM 字节码修改——改变方法体

我在jar里有一个类的方法,我想用我自己的方法交换它的主体。在这种情况下,我只想让方法在控制台上打印出“GOTIT”并返回true;我正在使用系统加载器来加载jar的类。我正在使用反射使系统类加载器能够通过字节码加载类。这部分似乎工作正常。我正在按照此处找到的方法替换示例进行操作:asm.ow2.org/current/asm-transformations.pdf。我的代码如下:publicclassMain{publicstaticvoidmain(String[]args){URL[]url=newURL[1];try{url[0]=newURL("file:////C://Us

java - JVM 字节码访问修饰符标志 0x1000(十六进制) "synthetic"何时设置?

对于一些Java字节码解析器项目,我阅读了JVM规范并发现Java虚拟机类文件格式访问修饰符字段的位掩码值是ACC_PUBLIC=0x0001ACC_FINAL=0x0010ACC_SUPER=0x0020#oldinvokespecialinstructionsemantics(Java1.0x?)ACC_INTERFACE=0x0200ACC_ABSTRACT=0x0400ACC_SYNTHETIC=0x1000ACC_ANNOTATION=0x2000ACC_ENUM=0x4000我不知道0x1000是干什么用的。我在一个内部类中看到过一次,但从那以后我检查过的所有内部类都没有设

java - 哪些 Scala 语句或代码可以生成无法转换为 Java 的字节码?

我读过answer关于将Scala代码转换为Java代码的问题。它说:我认为不可能从Scala转换回标准Java,因为Scala会执行一些非常低级的字节码操作。我90%确定他们做的一些事情无法完全转换回正常的Java代码。那么什么Scala语句或代码可以生成无法转换为java的字节码?附言我大体上同意这个答案,但想要一个具体的例子以供学习之用。 最佳答案 答案实际上取决于您想要尝试转换代码的努力程度。由于Java和Scala都是图灵完备的,一个中的任何程序都可以轻松地转换为另一个,但这并不是很有趣或有用。您真正想要的是将结果转换为可

java - 字节好友 : Create implementation for an abstract class

我想使用ByteBuddy在运行时为抽象类创建一个实现,我遇到了一个问题,当从创建的实例。我有一个像这样的现有abstract类(我实际上无法修改它,它实际上包含更多逻辑):publicabstractclassAlgorithm{abstractintexecute();}使用以下最小样本,我希望我的Algorithm实例返回一个常量值:Classtype=newByteBuddy().subclass(Algorithm.class).method(ElementMatchers.named("execute")).intercept(FixedValue.value(42)).m

Java 字节码 DUP

我想知道为什么以下字节码中的异常(用于抛出异常)是重复的。NEWjava/lang/IllegalArgumentExceptionDUPINVOKESPECIALjava/lang/IllegalArgumentException()VATHROW 最佳答案 我将逐行分析此操作,其中[]=使用该操作后的新堆栈:NEW将新的IllegalArgumentException放入堆栈[SomeIllegalArgumentException]DUP复制它[SomeIllegalArgumentException,SomeIllegalA

JavaScript 中的 Java 字节码编译器

我正在寻找用JavaScript实现的标准Java到Java字节码编译器。有没有人听说过任何可以做到这一点的东西? 最佳答案 这里有几个:https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS比如j2js、bicavm、doppio...(看java部分) 关于JavaScript中的Java字节码编译器,我们在StackOverflow上找到一个类似的问题:

java - 调试 VerifyError 的好工具?

关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭8年前。Improvethisquestion我找到了字节码VerifyErrors众所周知很难调试。JVM提供的反馈很少,通常只是当前类,有时是方法。我在通过ASM手动设计字节码时通常遇到的一些错误示例或Jasmin:堆栈大小太大无法从空堆栈中弹出操作数从代码末尾掉落期望在堆栈中

c# - 为什么基于堆栈的 IL 字节码中有局部变量

在基于堆栈的中间语言中,例如CIL或Java字节码,为什么会有局部变量?可以只使用堆栈。手工制作的IL可能不是那么容易,但编译器肯定可以做到。但是我的C#编译器没有。堆栈和局部变量都是方法私有(private)的,并且在方法返回时超出范围。所以它与从方法外部(从另一个线程)可见的副作用没有任何关系。如果我是正确的,JIT编译器在生成机器代码时会消除对堆栈槽和局部变量的加载和存储,因此JIT编译器也看不到对局部变量的需要。另一方面,C#编译器会为局部变量生成加载和存储,即使在启用优化的情况下进行编译也是如此。为什么?例如,以下人为设计的示例代码:staticintX(){inta=3;i

java - Java break/label 语句可以在字节码混淆中充当 "goto"吗?

我试图在反编译后对一些Java.class文件进行去混淆处理,但我遇到了部分代码,它以我认为无法使用的方式使用标签。我不知道这是反编译器误解标签的错误,还是代码被故意这样混淆了。也就是说,在Java字节码中可以这样使用标签吗?请注意,标checkout现在相关的break语句之后,而不是之前。它几乎似乎是将它们用作goto,而不是用于跳出循环的标签。也根本没有循环,所以我对它们应该如何在这里使用有点困惑。这是怎么回事?我在评论中标记了3个标签(###)if(i!=96){if((i^0xFFFFFFFF)!=-98){if(i==98)breaklabel417;//###Herear

java - 如果一个方法由其显式类型调用,它对运行时性能有影响吗?

我目前正在编写一个创建Java字节码并编写方法调用的应用程序。到目前为止,编写此字节代码的模块没有关于调用方法调用的实例的实际类型的信息,但它确实知道为其定义特定方法的类型。例如:classFoo{publicvoidfoo(){}}classBarextendsFoo{publicvoidbar(){}}引擎的当前版本将执行INVOKEVIRTUALFoo.foo甚至在Bar类型的对象上,因为它知道foo是在Foo中定义的。这在JVM中是合法的(当然),但Java编译器会将其翻译成INVOKEVIRTUALBar.foo当它是“正常的”Java源代码时。我目前想知道JVM是否实际使用