Tag: 字节码

从内存中获取Java类字节码(多次转换后)

我正在为Minecraft开发一个coremod,并在加载时转换很多类。 然而问题是有多个coremod也会改变我所使用的相同类,并且我得到了一些我想要研究的奇怪行为。 然后是问题,如何在多次转换后检查字节码? 当我转换它时,我只得到一个byte []输入,我通过ASM运行然后返回我修改的字节码。 我的想法是在加载类之后将类字节码转储到.class文件,并从那里检查它。 但是在加载类之后,我似乎无法找到任何实际获取字节码的方法。 我能找到的最接近的是getResource,但它返回字节码,因为它是在转换之前,而不是我想要的。 TLDR:如何在修改和加载类之后获取类的字节码? – 不要使用ClassLoader.getResource,因为它返回未修改的版本。 – 在加载时没有得到它,因为我想捕捉自己之后发生的变换。 是否有一些外部程序可以转储内存中的字节码或什么? 希望有人能帮我这个=)

动态重新加载jar文件内容

我的应用程序的类路径中有一个jar文件。 在运行时,我向jar文件添加新类,有时还修改现有类的字段/方法。 目前我正在使用URLClassLoader动态加载类。 动态添加的新类正确加载,我可以在运行时使用它们。 但它无法重新加载在运行时修改的现有类。 我阅读了许多文章,声明我们需要显式处理重新加载,因为在类的所有引用都被销毁之前,不会重新加载一次加载的类。 此外,我尝试了我找到的示例代码,但没有一个工作。 任何人都可以建议我适当的重新加载方法吗? 任何示例代码都将受到高度赞赏。

Java字节码是否与不同版本的Java兼容?

如果我使用Java 5代码将应用程序编译成字节码, 那么生成的.class文件是否能够在Java 1.4下运行? 如果后者可以工作,我正在尝试在我的Java 1.4应用程序中使用Java 5框架,那么我应该注意什么?

如何将类文字编译为Java字节码?

public class A { } public class B { public static void b() { System.out.println(A.class); } } 如何在B.class的字节码中编译类文字A.class ? 它是一个现场参考? 我在Oracle / Sun的字节码文档中找不到这一点。 无论是什么,反编译器都可以轻松地重建它: java -jar decompiler.jar B.class 拿起JAVA_TOOL_OPTIONS:’ – Dfile.encoding = UTF8′ // //由Procyon v0.5.30反​​编译// // public class B { public static void b() { System.out.println(A.class); <<< } }

为什么null不是编译时常量?

因此,如果我有一个static final Object CONSTANT = null ,由于某种原因,如果我在另一段代码中引用它,如doSomething(CONSTANT) ,它将不会在编译期间嵌入到代码中。 所以编译后不是doSomething(null) ,而是doSomething(CONSTANT) 。

从字节码解析类名

是否有可能从类源代码中形成的字节码中挖掘出一个类名? 情况是这样的:我从某个地方远程获取一个类字节码,它来自哪里无关紧要。 要使用类加载器有效地加载该类,我需要具有类名…对吗?

序列化与字节码转换

我是编程的初学者,我只是想知道序列化过程和转换为字节代码(中间语言)的过程之间是否存在差异。 我在javacodegeeks.com上找到了这个: 当需要通过网络发送数据或存储在文件中时,通常会使用序列化。 数据我指的是对象而不是文本。 现在的问题是您的网络基础设施和您的硬盘是理解位和字节但不了解Java对象的硬件组件。 序列化是将Java对象的值/状态转换为字节以通过网络发送或保存它。 – > 另一方面,反序列化是将字节代码转换为相应的java对象。 < – 根据我对这一段的理解,序列化可能是java将其程序转换为字节代码以便能够传输到不同计算机环境并仍能正常运行的过程。 我在想这个是正确的吗?

为什么JVM允许我们命名以字节码中的数字开头的函数?

标识符由Java语言规范,Java SE 7 Edition (§3.8)很好地定义 An identifier is an unlimited-length sequence of Java letters and Java digits, the first of which must be a Java letter. 据我所知,由于方法名称是标识符,因此不可能在java中命名以数字开头的方法,而javac遵守此规则。 那么,为什么Java虚拟机似乎不遵守这个规则,允许我们在Bytecode中命名一个以数字开头的函数? 这个简单的代码片段实际上会打印f99()方法名称及其参数的值。 public class Test { public static void main(String[] args) { Test t = new Test(); System.out.println(t.f99(100)); } public int f99(int i){ System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); return i; } } […]

查找方法的字节码大小

我试图找出一个方法的字节码大小,因为我想确保它足够小,可以通过编译器优化来内联。 我看到内联方法的默认最大大小是35,所以如果方法大于那个,我将修改代码或将其分解为多个方法。 我有一个方法生成下面的字节码(通过IntelliJ IDEA的ASM字节码大纲插件反汇编)。 如何判断该方法的字节码大小? LINENUMBER似乎引用了原始源代码的行号。 TIA public static mergeNativeArrays([Ljava/lang/Object;[Ljava/lang/Object;IZ)[Ljava/lang/Object; L0 LINENUMBER 865 L0 ALOAD 0 ASTORE 4 L1 LINENUMBER 867 L1 ILOAD 2 IFGE L2 L3 LINENUMBER 868 L3 ALOAD 0 ARRAYLENGTH ISTORE 2 L2 LINENUMBER 870 L2 FRAME APPEND [[Ljava/lang/Object;] ILOAD 2 ALOAD 1 ARRAYLENGTH IADD ISTORE 5 L4 LINENUMBER 872 L4 ALOAD […]

读取Java字节码指令:数字是什么意思?

我正在阅读java字节码,看到了这个: getfield #5 (Field java.lang.String name) #5是什么意思? 我怎样才能用字节码编写程序?