我正在将一个简单的类转换为一条记录,如下所示:
public class Mine {
private final String name;
public Mine(String name) {
this.name = name == null ? "a" : name;
}
}
Run Code Online (Sandbox Code Playgroud)
本能地,我是这样写的:
public record Mine(String name) {
public Mine {
this.name = name == null ? "a" : name;
}
}
Run Code Online (Sandbox Code Playgroud)
无法编译:cannot assign a value to final variable name.
我有点困惑,因为这个紧凑的构造函数有效:
public Mine {
name = name == null ? "a" : name;
}
Run Code Online (Sandbox Code Playgroud)
我无法真正理解发生了什么,所以我决定查看字节码:
0: aload_0
1: invokespecial #1 // Method java/lang/Record."<init>":()V
4: aload_1
5: …Run Code Online (Sandbox Code Playgroud) Java编程语言中最昂贵的(字节码和cpu周期)语句是什么?
我有一个javaagent jar,我把它放在bootclasspath上
Boot-Class-Path: myagent.jar
Run Code Online (Sandbox Code Playgroud)
在MANIFEST.MF文件中.
我需要找到jar所在文件系统的目录.
然而,这里描述的方法似乎并不适合我:
new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ProtectionDomain.getCodeSource()返回null.我想这种情况正在发生,因为jar已被放在引导类路径中.因此,我也无法通过MyClass.getClassLoader()来获取资源位置.
我使用的是Java 6.
任何人都可以告诉如何获得罐子的位置?
为什么我必须在字节码优化中执行此mem2reg传递以获得另一个优化传递结果?mem2reg有什么用?
opt -dce myfile.bc
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我没有改变输出代码
opt -mem2reg -dce myfile.bc
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,我对输出代码进行了更改
编辑:LLVR IR仍然是SSa形式,不是吗?使用mem2reg我应该有一个"修剪"的SSA表格,是吗?
我定义了一个名为的java类DefineFields.它有一个空构造函数.当我编译它时,classes.dex文件中的十六进制代码显示如下:
7010 050C 0000 0E00 (show in little endian)
Run Code Online (Sandbox Code Playgroud)
之后,我搜索字节码规范,我发现它
(spec code) (hex of dex)
70 35c: invoke-direct (7010)
05 22x: move-wide/from16 (050C)
00 10x: nop (0000)
0E 10x: return-void (0E00)
Run Code Online (Sandbox Code Playgroud)
我读了规范.但我不能完全理解是什么35c.(我知道c,x在规范中有解释表.)更多我想知道的是我如何解释10在7010和 0C中的十六进制050C
这些东西与规范操作码不匹配.
我想用新内容替换方法体(sample.class:sayHello方法),然后执行sample.class.原来的sayHelo声明是:
public int sayHello(String args){
}
Run Code Online (Sandbox Code Playgroud)
我想修改它的主体:
System.out.println("sxu says: hello world!");
return 1;
Run Code Online (Sandbox Code Playgroud)
但是样例执行结果抛出异常:
Exception in thread "main" java.lang.VerifyError: Operand stack overflow
Exception Details:
Location:
code/sxu/demo/data/sample.sayHello(Ljava/lang/String;)I @4: ldc
Reason:
Exceeded max stack size.
Current Frame:
bci: @4
flags: { }
locals: { 'code/sxu/demo/data/sample', 'java/lang/String' }
stack: { 'code/sxu/demo/data/sample', 'java/io/PrintStream' }
Bytecode:
0000000: 2ab2 0028 122a b600 1704 acb2 0028 2bb6
0000010: 0017 04ac
Run Code Online (Sandbox Code Playgroud)
我使用asm工具,我的代码中有三个java类:
public class Adapt extends ClassLoader {
@Override
protected synchronized Class<?> loadClass(final String name,
final boolean resolve) …Run Code Online (Sandbox Code Playgroud) 如果我有一个泛型类,编译器是否为我使用它的每个类型创建了一个不同的类?让我们考虑一下Class<T>.如果我创建类型的两个实例Class<Integer>和Class<String>,该编译器创建两个不同的类别?
如果答案是否定的:扩展泛型类的类如何可以继承具有不同类型(来自单个类)的相同方法或属性.
另一个问题:为什么我不能var instanceof Class<Integer>使用参数化类型而不是Class或Class<?>?
如果我尝试这样做,我会收到以下错误:"无法对参数化类型执行instanceof检查Test<Integer>.请改用表单,Test<?>因为在运行时将删除更多泛型类型信息"
你能给我更多关于仿制药的信息吗?
我在理解Java中内部类的访问标志(特别是私有)的使用时遇到了问题.我在字节代码中找到的标志似乎与反射API提供的信息不一致.
我附上以下程序来说明问题.该程序有一个私有内部类,并使用三种不同的方法进行自我分析:
令人惊讶的是,这给出了不同的结果,这是输出:
inner class is private (inspection): false
inner class is private (reflection): true
inner class is private (ASM): false
Run Code Online (Sandbox Code Playgroud)
有谁知道这里发生了什么?下面是复制问题的代码,我在Mac上使用了JRE build 1.8.0_05-b13来运行它.
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Opcodes;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Modifier;
public class TestModifiers {
// this is the class to be tested
private class InnerClass {}
public static void main(String[] args) throws Exception {
// check whether class is private using inspection, and comparison with …Run Code Online (Sandbox Code Playgroud) 我的代码看起来像这样:
boolean[] array = new boolean[200];
int[] indexes = {10, 42, 62, 74};
while(true) {
//some code here
StringBuilder sb = new StringBuilder();
for (int j : indexes) {
sb.append(array[j] ? '1' : '0');
}
}
Run Code Online (Sandbox Code Playgroud)
字典代码:
ASTORE 3 //"indexes" array
...
ALOAD 3
ASTORE 8
ALOAD 8
ARRAYLENGTH
...
Run Code Online (Sandbox Code Playgroud)
我不确定为什么javac复制引用数组到另一个本地var.
操作数堆栈的最小槽大小和局部变量表槽大小为"int".
那么我们如何获得将变量声明为short,byte等的好处.
bytecode ×10
java ×8
optimization ×2
class ×1
classloader ×1
dalvik ×1
dex ×1
generics ×1
java-17 ×1
javaagents ×1
javac ×1
jvm ×1
llvm ×1
record ×1
smali ×1