Tag: 字节码

是否可以在运行时检索lambda表达式

我昨晚玩Java8 Lambda,我想知道是否可以在运行时检索Lambda表达式。 简而言之,据我所知,Lambda表达式在运行时转换为(静态)方法,然后使用InvokeDynamics调用。 我们举个这样的例子: people.filter(person -> person.getAge() >= minAge); filter是一个以Predicate为参数的自定义方法。 在这个filter方法中,我怎样才能以与Lambda表达式相似(或相同)的forms检索参数( person -> person.getAge() >= minAge )? 我试图使用ASM5_BETA读取参数类的生成字节码,但是我无法使用ClassVisitor和MethodVisitor来访问与Lambda表达式相关联的方法。 public List filter(Filter expression) { try { Class expressionClass = expression.getClass(); byte[] content = getClassContent(expressionClass); ClassReader classReader = new ClassReader(content); classReader.accept(new PredicateClassVisitor(), 0); } catch (Throwable e) { e.printStackTrace(); } return null; } private byte[] getClassContent(Class expressionClazz) […]

什么Java编译器使用jsr指令,为什么?

Java字节码语言具有JSR指令。 我用Java 7编译器编译的代码都没有使用此指令。 但是,有时我下载的Java二进制文件确实使用它,尽管很少。 我有兴趣知道编译器使用什么指令,以及Java代码构造会导致它们使用它。 编辑它不是重复的,因为它引用了JSR字节码指令而不是Java规范请求

检查Java字节码是否包含调试符号

我想知道如何检查编译的Java类是否包含调试符号。 问题是我使用debug =“on”从ant编译应用程序,但是特定的JVM会抛出exception:它表示缺少调试符号。 谢谢。

如何静态地在JAR中识别缺失的方法(二进制兼容性)

我想validation2个JAR之间的二进制兼容性。 根据这个答案中的建议,我使用了jboss tattletale,但它只能找到缺少的类。 如何找到缺少的方法? 有可能吗? 例如 “取决于 – ” Foo 课取决于Bar(像许多其他中产阶级工人一样) import org.overlyusedclassnames.Bar public class Foo{ public void someMethod(){ Bar tender = new Bar(); tender.getJohnnyRedLabel(); tender.getJohnnyBlueLabel(); //this method is new in the Bar class } } “编译时间”课程 package org.overlyusedclassnames; /** * @Since 1992 * Changes: added blue and gold Johnny Walker labels */ public class […]

编译器优化:Java字节码

我目前正在编写一个针对Java字节码的玩具编译器。 我想知道在编写.class文件之前是否存在可以在发出的字节码中进行的各种简单窥孔优化的某种目录,可能是摘要。 我实际上知道一些具有此function的库,但我想自己实现它。

是否有java类文件/字节码编辑器来编辑指令?

是否有用于编辑java类文件的实用程序(或eclipse插件)? 我想操纵java类文件的字节码而不重新编译它也没有完整的构建路径。 例如,重命名方法,添加/删除指令,更改常量等。 我发现的唯一工具是: 但是它的function非常有限( 例如,重命名事物和操纵指令是不可能的 )。 jbe不保存更改(可能因为类validation失败 – 在我进行任何更改之前,尽管类运行完美) (jbe最初有一个类路径问题,将jbe.bat文件的类路径添加到了帮助中)

为什么要将String编译切换为两个开关

我在编译开关时阅读了JVM规范 ,并对如何编译String上的switch语句感兴趣。 这是我检查的测试方法(JDK1.7.0_40): static int test(String i) { switch (i) { case “a”: return -100; case “45b”: return 1; case “c”: return 2; default: return -1; } } 我希望这个方法可以在string的hashCode上编译成简单的lookupswitch,但突然之间 static int test(java.lang.String); Code: 0: aload_0 1: astore_1 2: iconst_m1 3: istore_2 4: aload_1 5: invokevirtual #6 // Method java/lang/String.hashCode:()I 8: lookupswitch { // 3 97: […]

如何找到方法中调用的所有方法?

如何获取在特定方法中调用的其他类的方法? 例 方法getItem1() public String getItem1() throws UnsupportedEncodingException{ String a = “2”; a.getBytes(); a.getBytes(“we”); System.out.println(a); int t = Integer.parseInt(a); return a; } getItem1()中调用的方法是: String.getBytes() String.getBytes(String) PrintStream.println(String) Integer.parseInt(String)

有没有办法在运行时获取类的字节码?

在Java中,是否有一种方法(在运行时)获取定义特定类的字节码? 换句话说,有没有办法在加载特定类时获取传递给ClassLoader.defineClass(String name, byte[] b, int off, int len)的byte[]数组? 我看到这个方法被声明为final ,因此创建一个自定义ClassLoader来拦截类定义似乎是不可能的。 在过去,我使用类的ClassLoader通过getResourceAsStream(String)方法获取字节码,但我更喜欢更规范的解决方案。

什么是Java 7 try-with-resources字节码等效使用try-catch-finally?

我试图通过使用常规的try-catch-finally语句重新创建它来了解新的try-with-resources语句是如何工作的。 给定以下使用Java 7 try-with-resources的测试类: import java.io.IOException; import java.util.zip.GZIPOutputStream; public class TryWithResources { public static void main(String[] args) { try (GZIPOutputStream gzip = new GZIPOutputStream(System.out)) { gzip.write(“TEST”.getBytes(“UTF-8”)); } catch (IOException ioe) { ioe.printStackTrace(); } } } 你会如何重写这个类来使用try-catch-finally语句,它产生与try-with-resources语句产生完全相同的字节码? 此外,使用两个资源时的问题相同,如下例所示: import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream; public class TryWithResources2 { public static void main(String[] args) { try (ByteArrayOutputStream […]