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) 我一直试图通过玩转 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) 如何在运行时使用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 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
我正在编写一个输出 JVM 字节代码的编译器,并使用 ASM 9.4 作为后端。这工作得很好,但我对一个特殊的怪癖感到困惑。
我指定COMPUTE_FRAMES自动计算堆栈帧。据说,这种权衡是(可以理解)这使得代码生成需要更多时间,但它似乎足够快。
我能找到的任何地方都没有记录,指定COMPUTE_FRAMES会导致生成大量冗余指令。具体来说,athrow每个方法末尾都有一个 ,并且在某些情况下,一堆长运行的nops 分散在该方法中。
这似乎并没有造成任何伤害;我最初的测试用例顺利通过,我想 JIT 编译器实际上不会为冗余指令生成任何机器代码。但这有点令人不安。它为什么要这样做?我做错了什么吗?
有没有办法修改.class文件以便为某些方法添加Java注释?基本上我想遍历jar文件中的每个类文件的方法并注释某些类文件.请注意,在使用jar文件时,这不是在运行时.相反,在我完成之后,我想要使用注释修改类文件.
我有权访问源代码,所以如果有一个自动源代码修饰符,那也可以...
我终于看到了一个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) 我想在一些耗时的方法上做一些工具,比如 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循环,如下所示:
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) java ×8
annotations ×2
bytecode ×2
jvm-bytecode ×2
assembly ×1
avx ×1
java-8 ×1
jvm ×1
jvm-hotspot ×1
modelmapper ×1
reflection ×1
return ×1
version ×1
x86 ×1