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

标签 java spring

对于同一个 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/

相关文章:

java - 如何在Java中解析JSON

java - 导入数字的值为 123,45,但 123.45 使用 JAVA 存储在数据库中

java - 将 ByteArray 均匀分区为 Queue 的 ByteArray

java - Spring 中使用 Pagination/Page 的表别名中的 JPA 未知列

spring - Faker for Grails 给出变量未定义错误

java - 使用 java 字符串操作删除查询参数

java - GroovyShell 和类路径

spring - JavaEE 6 和 Spring

spring - 为什么在将 spring cloud api 网关速率限制与 redis 一起使用时,响应 header 中的 X-RateLimit-Remaining -1?

java - 声明到 Spring MVC 应用程序的 web.xml 中的 Spring Security 过滤器到底如何工作?