Tag: 字节码

x = x + 1和x ++的实现差异

我的教授最近说过,虽然x = x + 1和x++显然会给出相同的结果,但它们在JVM中的实现方式却有所不同。 这是什么意思? 是不是编译器:嘿,我看到x++所以我将它切换到x = x + 1并继续? 我怀疑在效率方面有什么不同,但如果在这些情况下assembly会有所不同,我会感到惊讶……

何时何地在Java源代码中初始化/存储String?

这是我的源代码: public class Koray { public static void main(String [] args) { System.out.println(“This is a sample program.”); } } 当我编译它时,我得到字节码。 当我用hex查看器查看字节码时,我看到部分: 19 54 68 69 73 20 69 73 20 61 20 73 61 6D 70 6C 65 20 70 72 6F 67 72 61 6D 2E 可以读作 This is a sample program. 如果字节被解释为字符。 而当我这样做 […]

Java字节码反编译 – 未使用的方法存在?

说我有 private void ThisIsMySecurityMethodPleaseLookHERE() { //security stuff } 在我的程序中,但是在任何实际执行的代码中都没有调用该方法。 它被编译为字节码吗? 或者Java编译器是否识别出这个事实并将其过滤掉? 我知道它永远不会成为PAST字节码,因为它不是真正的调用。 我问,因为我知道Java很容易反编译。 当他们反编译我的.class文件时,我的所有未使用的方法也会出现吗? 我认为情况并非如此,因为如果是这样的话,每个java文件都会有膨胀代码来隐藏真实代码,并通过混淆器传递。 我只是试图想出除了混淆之外的方法来抵制随意的黑客。

是否有运行时代理创建库,它支持保留代理类的注释?

使用例如cglib或javassist代理创建代理时 ,通过创建代理目标的子类来实现此代理。 但是,这意味着此代理上的注释将丢失。 当一个类由两个库处理时,这是有问题的,其中: 第一个库需要创建给定类的代理才能运行。 第二个库通过从中读取注释来处理对象。 对于第二个库,当同时使用第一个库时,注释已消失。 问题是:是否存在具有高级API的运行时代码生成库,可以轻松保留代理类的注释?

ASM通过代码查找偏移量

我想在我使用的测试用例中找到不同方法的偏移量。 我可以找到方法开始和结束的位置,我查找操作码RETURN和ARETURN(我在方法visitInsn()中扩展一个methodVisitor的类中这样做),但是我无法找到那些在那里发生的偏移量字节码。 有任何想法吗? 为了以防万一:我正在使用ASM的核心API,我知道树API可以帮助我找到我需要的东西,但树API使一切都变得缓慢并使用内存,我买不起任何这些,所以我使用核心API

哪个JVM具有完整的字节码执行跟踪?

我需要整个Java程序的完整字节码级执行跟踪。 我找到了带有SingleStep事件的JVM TI,它让我能够编写一个能产生跟踪的代理。 但肯定有一个现成的JVM选项吗?

Java ASM GeneratorAdapter变量命名

我正在生成一个简单的类,无法注入适当的变量名称。 ASM版本是5.2 。 这是代码: package com.test; import org.objectweb.asm.*; import org.objectweb.asm.commons.GeneratorAdapter; import org.objectweb.asm.commons.Method; import java.nio.file.Files; import java.nio.file.Paths; public class Main { public static void main(String[] args) throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); String name = “com.test.Sub”; cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name.replace(‘.’, ‘/’), null, “java/lang/Object”, null); Method ctor = Method.getMethod(“void ()”); GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, ctor, […]

尝试重新定义sun.reflect.GeneratedMethodAccessor1时,ByteBuddy失败

在好奇心的驱使下,我试图导出GeneratedMethodAccessor1的字节码(使用reflection时由JVM生成)。 我尝试通过以下方式获取类的字节码: public class MethodExtractor { public static void main(String[] args) throws Exception { ExampleClass example = new ExampleClass(); Method exampleMethod = ExampleClass.class .getDeclaredMethod(“exampleMethod”); exampleMethod.setAccessible(true); int rndSum = 0; for (int i = 0; i < 20; i++) { rndSum += (Integer) exampleMethod.invoke(example); } Field field = Method.class.getDeclaredField("methodAccessor"); field.setAccessible(true); Object methodAccessor = field.get(exampleMethod); Field delegate […]

最好的选择? 在编译之前编辑字节码(asm)或编辑java文件

目标 检测变量之间的比较和变量的复制 在操作发生的行附近注入代码 代码的目的:每次运行类都会使计数器增加 通用:计算执行后使用某些参数进行的比较和复制的数量 2个选项 注意:我总是有一个.java文件 1)编辑java文件 找到与正则表达式的比较并在行附近注入代码片段然后编译该类(我的应用程序使用JavaCompiler) 2)使用ASM字节码工程 还检测我想跟踪的事件的位置并将片段注入字节码然后使用(已经编译但已修改)的类 我的问题 什么是最好/最干净的方式? 有一个更好的方法吗?

从Java程序获取局部变量的名称和类型

这是我正在尝试的代码: JavaCompiler compilerA = ToolProvider.getSystemJavaCompiler(); int resultA = compilerA.run(null,null,null,”/Users/a/Documents/Java/a.java”); System.out.println(“Compile result code = ” + resultA); File fileA = new File(“/Users/a/Documents/Java/a.class”); JavaCompiler compilerB = ToolProvider.getSystemJavaCompiler(); int resultB = compilerB.run(null,null,null,”/Users/a/Documents/Java/b.java”); System.out.println(“Compile result code = ” + resultB); File fileB = new File(“/Users/a/Documents/Java/b.class”); 这里我编译一个Java类,然后使用reflection来获取所有函数名,参数和返回类型。 但是,我不知道如何获取函数的局部变量的名称和返回类型。 我尝试查找字节码大纲,但它说它不适用于netbeans。 请帮帮我。