gpt4 book ai didi

java - 如果参数名称在编译时被删除,Spring LocalVariableTableParameterNameDiscoverer 如何通过读取类文件来获取名称?

转载 作者:行者123 更新时间:2023-12-02 12:47:21 43 4
gpt4 key购买 nike

对于同一个 Junbin.java 文件,javac、javac -parameters 和 gradle build 编译的输出是不同的。我想用三种情况来说明让我困惑的问题。

原始文件Junbin.java

public class Junbin {
public Junbin() {
}

public static void main(String[] ko) throws UnknownHostException, SocketException, ClassNotFoundException {
System.out.println("-----");
}

public static void t(List<? super Integer> lis) {
lis.add(Integer.valueOf(1));
}
}

1、javac Junbin.Java -参数第一种情况,main方法的参数“ko”可以通过Java8中添加的Method.getParameters()获取。

2、javac Junbin.java如果我不在 javac 上添加 -parameter 选项,Method.getParameters()[0].getName() 会打印 arg0,而不是“ko”。

对于上述两种情况,在Intellij idea中查看编译后的类文件如下所示。

public class Junbin {
public Junbin() {
}

public static void main(String[] var0) throws UnknownHostException, SocketException, ClassNotFoundException {
System.out.println("-----");
}

public static void t(List<? super Integer> var0) {
var0.add(Integer.valueOf(1));
}
}

参数名称均为arg0。

3、gradle构建Method.getParameters 无法获取“ko”。但是,Intellij idea中打开的gradle编译的输出类是正确的。如下图

public class Junbin {
public Junbin() {
}

public static void main(String[] ko) throws UnknownHostException, SocketException, ClassNotFoundException {
System.out.println("-----");
}

public static void t(List<? super Integer> lis) {
lis.add(Integer.valueOf(1));
}
}

我绝对可以通过 Spring 的 LocalVariableTableParameterNameDiscoverer 获取参数名称“ko”。

如果参数名称在编译时被删除,Spring LocalVariableTableParameterNameDiscoverer 如何通过读取类文件来获取参数名称?

最佳答案

它使用调试信息映射,如以下源代码快照中所述:

Map<Member, String[]> map = this.parameterNamesCache.get(declaringClass);
if (map == null) {
map = inspectClass(declaringClass);
this.parameterNamesCache.put(declaringClass, map);
}
if (map != NO_DEBUG_INFO_MAP) {
return map.get(originalMethod);
}

因此,当您编译源文件时,调试符号将被保存。如果您在没有它们的情况下编译文件,它也不会显示任何方法名称。所以,显然,Intellij Idea 根本不使用调试符号,这就是所有的解释:)

关于java - 如果参数名称在编译时被删除,Spring LocalVariableTableParameterNameDiscoverer 如何通过读取类文件来获取名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44717276/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com