驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
Java8反射获取形参名称
/  

Java8反射获取形参名称

开篇

Java8中引入了非常多的特性,对于我这个从C#转Java的开发人员而言,Lambda是我的最爱,让我觉得Java总算弥补了一块很大的短板(C#当时用Lambda真的很舒服)。

当然今天想聊聊的不是Labmda,这块内容另外抽时间聊,今天说说一个小特性:反射获取方法真正名称

缘由

曾经有个项目希望实现一个这样的技术需求:从方法中获取形参的真实名称,然后转成某个xml的一个属性。

当时本以为很简单,可以直接通过API获取,但是通过反射获取的形参的名称总是:arg0这样的参数。

项目在当时使用的JDK7,所以强行给每个形参加上注解指明方法的形参,类似:

    public void execute(@param("taskId") String taskId) {
            System.out.println(taskId);
        }

相信大家也看到了,这个做法确实不够优雅,但是在当时应该是唯一的解决办法了。

后来有段时间刷博客,刷到了介绍Java8的一篇文章对此有记录,当时就记下来了,前段时间有空,就实践了下,今天简单记录分享下。

过程

假设有如下方法:

    class Executor {
        public void execute(String taskId) {
            System.out.println(taskId);
        }
    }

我需要从execute方法中获取参数taskId这个形参的名称:taskId

在Java8中需要进行环境变量配置才可以通过如下代码获取:

   public static void main(String[] args) throws NoSuchMethodException {
        Class<Executor> executorClass = Executor.class;
        Method method = executorClass.getMethod("execute", String.class);
        for (Parameter parameter : method.getParameters()) {
            String name = parameter.getName();
            System.out.println(name);
        }
    }

配置环境

Intellij下通过进行如下设置:

java8参数显示.png

Eclipse下通过如下设置:

选择 Compiler然后选择如下参数即可:

eclipse参数设置.png

骐骥一跃,不能十步。驽马十驾,功在不舍。