标签: java-bytecode-asm

如何覆盖类文件 (asm.ClassWriter.getCommonSuperClass)?

What I am trying to do?
Run Code Online (Sandbox Code Playgroud)

我正在尝试在特定方法的开头和结尾添加 try/catch 块。

Why am I overriding asm.ClassWriter.getCommonSuperClass(String class1,String class2)?
Run Code Online (Sandbox Code Playgroud)

我正在使用标志 COMPUTE_FRAMES,因此,正在调用 asm.ClassWriter.getCommonSuperClass() 这个类,它试图使用 class.ForName() 再次加载一些类,并说 classNotFoundException。我在某处阅读以覆盖此方法并确保它加载了这两个类。我得到了 Instrumentation 对象并得到了所有加载的类,但仍有一些类没有加载,这个方法抛出 NullPointer 异常..

Any suggesstions how to override it? 
Run Code Online (Sandbox Code Playgroud)

根据以下回复编辑问题

我在这里的理解是:

1. 如果我想为方法内容添加 try/catch 块,则无需使用 COMPUTE_FRAMES 而不是 COMPUTE_MAXS。

2. 如果我只想为方法内容添加 try/catch 块,(仅假设 jdk8)那么我只需要编写 try/catch 块 ASM 部分,其余部分应该就位。

对于从线程调用的方法:

public void execute()throws IOException{
//some code

}
Run Code Online (Sandbox Code Playgroud)

下面的代码应该添加 try/catch 块并且不应该给出任何 java 验证错误?:

private Label startFinally = new Label();
  public void visitMaxs(int maxStack, int maxLocals) {
       Label endFinally = …
Run Code Online (Sandbox Code Playgroud)

bytecode java-bytecode-asm

4
推荐指数
1
解决办法
890
查看次数

ASM 中的 ClassWriter COMPUTE_FRAMES

我一直试图通过玩转 ASM 中的跳转来了解堆栈映射框架在 Java 中的工作原理。我创建了一个简单的方法来尝试一些东西:(用 Krakatau 拆卸):

    L0:     ldc 'hello' 
    L2:     astore_1 
    L3:     getstatic Field java/lang/System out Ljava/io/PrintStream; 
    L6:     new java/lang/StringBuilder 
    L9:     dup 
    L10:    invokespecial Method java/lang/StringBuilder <init> ()V 
    L13:    ldc 'concat1' 
    L15:    invokevirtual Method java/lang/StringBuilder append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
    L18:    aload_1 
    L19:    invokevirtual Method java/lang/StringBuilder append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
    L22:    invokevirtual Method java/lang/StringBuilder toString ()Ljava/lang/String; 
    L25:    invokevirtual Method java/io/PrintStream println (Ljava/lang/String;)V 
    L28:    getstatic Field java/lang/System out Ljava/io/PrintStream; 
    L31:    new java/lang/StringBuilder 
    L34:    dup 
    L35:    invokespecial Method java/lang/StringBuilder <init> ()V 
    L38:    ldc 'concat2' 
    L40:    invokevirtual …
Run Code Online (Sandbox Code Playgroud)

java bytecode-manipulation java-bytecode-asm jvm-bytecode

4
推荐指数
1
解决办法
698
查看次数

如何使用 ASM 读取 Java 类方法注释值

如何在运行时使用ASM读取 Java 方法注释的值?
注释只有一个CLASS RetentionPolicy,因此不可能使用反射来做到这一点。

| 策略CLASS:注释将由编译器记录在类文件中,但不需要在运行时由VM保留

示例:我想在运行时从字段中
提取值:Carly Rae Jepsenartist

public class SampleClass {

    @MyAnnotation(artist = "Carly Rae Jepsen")
    public void callMeMaybe(){}
}
Run Code Online (Sandbox Code Playgroud)
@Documented
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface MyAnnotation {

    String artist() default "";
}
Run Code Online (Sandbox Code Playgroud)

但为什么?
难道你不能只改变RetentionPolicytoRUNTIME并用反射来做吗?
简而言之:不。我使用modelmapper框架(简单、智能、对象映射)。在那里,我通过带注释的方法指定了 Java 类之间的双向映射。我不想重用此分层映射信息来进行更改事件传播。但提供的mapstruct org.mapstruct.Mapping注解有CLASS RetentionPolicy. 这就是为什么我需要从类文件中读取该信息 - 并且需要ASM

java reflection annotations java-bytecode-asm modelmapper

4
推荐指数
1
解决办法
1889
查看次数

Java 字节码 asm - 如何创建仅更改类名的类的克隆?

Java asm - 如何创建仅更改类名的类的克隆?

我知道有一种简单的方法可以使用 asm SimpleRemapper修改类名,但我只想更改外部类名,而不修改方法中使用的类名。(请参阅下面的示例)

基本上如果我有目标班级

public class Target {
  public Target clone(...) ...
  public int compare(another: Target) ...
}
Run Code Online (Sandbox Code Playgroud)

我只是想创建一个看起来像这样的克隆:

public class ClonedTarget {
  public Target clone(...) ...
  public int compare(another: Target) ...
}
Run Code Online (Sandbox Code Playgroud)

(请注意, 的返回类型clone和 arg 类型compare没有改变。这是针对我的用例而设计的)。

java bytecode bytecode-manipulation java-bytecode-asm java-8

4
推荐指数
1
解决办法
1030
查看次数

如何将 Opcodes 中 ASM 的 API 版本映射到 Java 版本?

ASMClassVisitor构造函数需要传递一个OpcodesASM4ASM5ASM6ASM7ASM8ASM9

我如何知道ASM#每个版本的 Java 使用哪个?我ASM#将在 Java 8 中使用什么?我ASM#将在 Java 11 中使用什么?

java version java-bytecode-asm

4
推荐指数
1
解决办法
403
查看次数

为什么COMPUTE_FRAMES会产生大量冗余指令?

我正在编写一个输出 JVM 字节代码的编译器,并使用 ASM 9.4 作为后端。这工作得很好,但我对一个特殊的怪癖感到困惑。

我指定COMPUTE_FRAMES自动计算堆栈帧。据说,这种权衡是(可以理解)这使得代码生成需要更多时间,但它似乎足够快。

我能找到的任何地方都没有记录,指定COMPUTE_FRAMES会导致生成大量冗余指令。具体来说,athrow每个方法末尾都有一个 ,并且在某些情况下,一堆长运行的nops 分散在该方法中。

这似乎并没有造成任何伤害;我最初的测试用例顺利通过,我想 JIT 编译器实际上不会为冗余指令生成任何机器代码。但这有点令人不安。它为什么要这样做?我做错了什么吗?

java java-bytecode-asm jvm-bytecode

4
推荐指数
1
解决办法
67
查看次数

是否主动向方法添加Java注释?

有没有办法修改.class文件以便为某些方法添加Java注释?基本上我想遍历jar文件中的每个类文件的方法并注释某些类文件.请注意,在使用jar文件时,这不是在运行时.相反,在我完成之后,我想要使用注释修改类文件.

我有权访问源代码,所以如果有一个自动源代码修饰符,那也可以...

我假设我需要一个像JavassistASM这样的工具.如果是这样,我应该使用哪一个,我将如何进行呢?

java annotations bytecode-manipulation java-bytecode-asm

3
推荐指数
1
解决办法
829
查看次数

Java终于返回了,奇怪的字节码

我终于看到了一个Java拼图问题,并返回

    int i = 0;
    try {
        return i;
    } finally {
        i++;
    }
Run Code Online (Sandbox Code Playgroud)

什么是这个函数的返回值,我知道这将返回0,我测试另一个代码

    StringBuffer sb = new StringBuffer("11");
    try {
        return sb;
    } finally {
        sb.append("22");
    }
Run Code Online (Sandbox Code Playgroud)

这是奇怪的事情,它返回"1122" 这是我的第一个问题:为什么它返回"1122"?

我反编译这两个java代码,

    0:   iconst_0 put 0 to the stack
1:   istore_0 store the stack top into index 0
2:   iload_0  put index 0 to the stack 
3:   istore_1 store the stack top into index 1
4:   iinc    0, 1 inc the index 0 with 1
7:   iload_1 put index 1 …
Run Code Online (Sandbox Code Playgroud)

java jvm return try-catch-finally java-bytecode-asm

3
推荐指数
1
解决办法
253
查看次数

ASM Java替换方法调用指令

背景

我想在一些耗时的方法上做一些工具,比如 org/json/JSONObject.toString()使用ASM Java框架.

原始调用方法

public class JSONUsage {
    public void callToString() {
        JSONObject jsonObject = new JSONObject();
        String a = jsonObject.toString();//original call
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

仪表后

public class JSONUsage {
    public void callToString() {
        JSONObject jsonObject = new JSONObject();
        // **important!**
        //pass the instance as an param, replace the call to a static method
        String a = JSONReplacement.jsonToString(jsonObject);
        System.out.println(a);
    }
}

public class JSONReplacement {

    public static String jsonToString(JSONObject jsonObject) {
        //do the time caculation
        long before …
Run Code Online (Sandbox Code Playgroud)

java bytecode-manipulation java-bytecode-asm

3
推荐指数
1
解决办法
2511
查看次数

vmovdqu在这做什么?

我有一个Java循环,如下所示:

public void testMethod() {
    int[] nums = new int[10];
    for (int i = 0; i < nums.length; i++) {
        nums[i] = 0x42;
    }
} 
Run Code Online (Sandbox Code Playgroud)

我得到的组件是这样的:

0x00000001296ac845: cmp    %r10d,%ebp
0x00000001296ac848: jae    0x00000001296ac8b4
0x00000001296ac84a: movl   $0x42,0x10(%rbx,%rbp,4)
0x00000001296ac852: inc    %ebp               
0x00000001296ac854: cmp    %r11d,%ebp
0x00000001296ac857: jl     0x00000001296ac845  

0x00000001296ac859: mov    %r10d,%r8d
0x00000001296ac85c: add    $0xfffffffd,%r8d
0x00000001296ac860: mov    $0x80000000,%r9d
0x00000001296ac866: cmp    %r8d,%r10d
0x00000001296ac869: cmovl  %r9d,%r8d
0x00000001296ac86d: cmp    %r8d,%ebp
0x00000001296ac870: jge    0x00000001296ac88e
0x00000001296ac872: vmovq  -0xda(%rip),%xmm0                                                    
0x00000001296ac87a: vpunpcklqdq %xmm0,%xmm0,%xmm0
0x00000001296ac87e: xchg   %ax,%ax

0x00000001296ac880: vmovdqu %xmm0,0x10(%rbx,%rbp,4)  
0x00000001296ac886: add    $0x4,%ebp …
Run Code Online (Sandbox Code Playgroud)

x86 assembly jvm-hotspot avx java-bytecode-asm

3
推荐指数
2
解决办法
1089
查看次数