Tag: 字节码

在类层次结构中混合使用Java 1.4和1.6字节码

问题首先,故事将遵循: 在类层次结构中混合使用不同的字节码版本是否安全? 有什么风险? 对于一个案例,C类扩展B,B类扩展A类.A类实现接口I.我的问题将涉及以下示例场景: A类编译为Java 1.6字节码,并具有1.6特性,如generics等。inheritance人,即B和C被编译为1.4字节码。 接口我编译为1.6,而实现者编译为1.4。 其他奇异的inheritance场景涉及不同版本的字节码。 我尝试了很多我能想象到的场景,似乎运行得很好。 但是我仍然觉得这里要求的冲动,因为我只知道表面上的Java; 我知道如何编写和调整Java,但不知道在幕后发生了什么。 现在对于那些无法自拔的人来说,“为什么你需要这样做?”。 我正在一个项目中评估通过RMI连接到EJB 2的旧Java 1.4 Swing应用程序到连接到运行在1.6之上的新版App Server的Java 1.6 Swing的迁移。 J2EE平台仍然是1.4(EJB 2)。 迁移不会“重新编译所有内容到1.6”,但它将是“代码并将新function编译为1.6”。 他们做事的方式是这样的:他们在CVS中只有一条路径,每个人都在那里提交。 没有任何标签/分支来获取生产代码。 每当需要添加新function时,他们从生产服务器获取JAR,爆炸它们,根据需要替换或添加新类,重新打包jar子,将它们放回服务器。 因此,如果他们将使用Java 6编译并使用上述方法进行部署,那么将会有很多exception混合的1.4和1.6字节码。

编写检测器以使用Findbugs搜索“System.out.println”的用法

我正在尝试使用Findbugs编写一个错误检测器来查找方法调用“System.out.println”的实例。 据我所知,字节码中的“System.out.println”被编译为对GETSTATIC的调用, 后者将“System.out”推送到堆栈上 。 对INVOKEVIRTUAL的调用会从堆栈中弹出“System.out”并调用该方法。 我准备了一些代码(见下文),它找到了正确的GETSTATIC和INVOKEVIRTUAL调用,但是无法将两者连接在一起。 我怀疑我可能需要以某种方式使用OpcodeStack,但我很难理解如何使用它。 任何帮助,将不胜感激。 @Override public void sawOpcode(int seen) { // if opcode is getstatic if (seen == GETSTATIC) { String clsName = getClassConstantOperand(); if (“java/lang/System”.equals(clsName)) { String fldName = getNameConstantOperand(); if (“out”.equals(fldName)) { System.out.println(“SYSTEM.OUT here”); } } } // if opcode is invokevirtual if (seen == INVOKEVIRTUAL) { String cls […]

Java中有多少字节的字节码有特定的方法?

我最近在Jon Masamitsu的Weblog上读到了大量的方法(8000字节的字节码)不是用HotSpot进行JIT编译的。 所以我的问题是:我如何找出(作为程序员)特定方法有多少字节的字节码? JIT编译器当然似乎知道。 我可以从.class文件中提取这条信息吗?

是否可以在运行时指定System ClassLoader加载.class文件?

我正在编写一个用于赋值的静态分析工具,它使用ASM库分析Java字节码。 我们使用的ASM的一个部分需要(或者至少看起来需要)从ClassLoader加载类。 我们希望该工具能够分析.class文件,而不需要它们在类路径上。 我们已经在运行时从指定的目录加载.classes并使用InputStream读取它们。 在大多数情况下,这对于ASM是可接受的。 有一些类,例如SimpleVerifier ,它们尝试加载类。 在这种情况下,是否可以注册要加载的.class文件,以便调用Class.forName()来加载它们? 或者有一种简单的方法来扩展ClassLoader以允许它吗? 编辑: URLClassLoader上的信息很有用。 不幸的是,使用Thread.currentThread().setContextClassLoader()到它的实例在这种情况下不起作用。 我正在调用的库代码使用它在使用getClass().getClassLoader()进行实例初始化时检索的加载器。 当我设置URLClassLoader时,该类尚未初始化,所以我猜contextClassLoader不加载该类。 我是否正确理解了答案? 是否可以使用URLClassLoader加载第三方类?

在运行时加载Java-Byte-Code

我得到了一些在我的程序中生成的java-byte-code(如此编译的java-source)。 现在我想将这个字节码加载到当前运行的Java-VM中并运行一个特定的函数。 我不知道如何实现这一点,我在Java类加载器中挖掘了一点,但没有找到直接的方法。 我找到了一个解决方案,它在硬盘上采用了一个类文件,但是我得到的字节码是在字节数组中,我不想把它写到磁盘上而是直接使用它。 谢谢!

生成’Hello,World!’ 使用Java ASM库的类

我已经开始乱用我正在研究的编译器项目的ASM API。 但是,我发现文档对于很多地方的新手来说还不太清楚,我认为有一个很好的例子来生成一个只打印“Hello,World!”的类。 这将是一个很好的例子。 目前,我可以使用main()(使用ClassWriter,ClassVisitor和MethodVisitor类)生成一个类,但我似乎无法弄清楚如何生成main的主体。 任何人都可以给我一个在ASM中生成类文件的示例: 包含一个main() 在main()中创建一个本地String变量,其值为“Hello,World!” 打印变量

是否可以查看Java类文件字节码

我正在使用Java进行字节码操作/生成,我只是想知道是否有一种简单的方法可以检查字节码。 我不想反编译文件,我想实际看看编译后的字节码。 我不需要编辑它。 任何用于执行此操作的链接或程序都是可接受的答案。

以编程方式检查.class文件

我正在开发一个项目,我们在Java服务和用其他各种语言编写的客户端之间进行大量的远程对象传输。 鉴于我们目前的限制,我决定看看基于现有Java类生成代码需要什么。 基本上我需要一个.class文件(或它们的集合)解析字节码以确定所有数据成员和可能是getter / setter然后编写一些可以用不同语言输出代码的东西来创建一个具有相同语言的类结构体。 我不是在寻找像JAD这样的标准反编译器。 我需要能够获取.class文件并创建其数据成员和方法的对象模型。 这有可能吗?

java字节码的不同行为

我是Java Bytecode的新手。 我通过一些例子理解字节码,但我陷入了一个例子。 这些是我的java和字节码文件 class SimpleAdd{ public static void main(char args[]){ int a,b,c,d; a = 9; b = 4; c = 3; d = a + b + c; System.out.println(d); } } Compiled from “SimpleAdd.java” class SimpleAdd extends java.lang.Object{ SimpleAdd(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object.””:()V 4: return public static void main(char[]); Code: […]

为什么没有更多的Java软件本地编译?

我意识到字节码与本机代码(可移植性)的好处 。 但是,你总是知道你的代码将在x86架构上运行,为什么不编译为x86并获得性能优势呢? 请注意,我假设本机代码编译有性能提升。 有些人回答说实际上可能没有收获对我来说是个新闻。