在Java8之前,代码编译为class文件后,方法参数的类型固定,但是方法名称会丢失,方法名称会变成arg0、arg1....。而现在,在Java8开始可以在class文件中保留参数名,这就给反射带来了极大的遍历。像mybatis等需要使用反射机制获取方法参数的时候就可以不用像以前一样需要使用类似于@Para之类的注解。

功能测试

代码参考自,点击进入

  1. 编写测试类

    import java.lang.reflect.Method;
    import java.lang.reflect.Parameter; public class GetRuntimeParameterName {

    public void createUser(String name, int age, int version) {
    }
    
    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(String[] args) <span class="kw">throws</span> Exception {
    <span class="kw">for</span> (Method m : GetRuntimeParameterName.<span class="fu">class</span>.<span class="fu">getMethods</span>()) {
    System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"--------------------"</span>);
    System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">" method: "</span> + m.<span class="fu">getName</span>());
    System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">" return: "</span> + m.<span class="fu">getReturnType</span>().<span class="fu">getName</span>());
    <span class="kw">for</span> (Parameter p : m.<span class="fu">getParameters</span>()) {
    System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"parameter:"</span> + p.<span class="fu">getType</span>().<span class="fu">getName</span>() + <span class="st">", "</span> + p.<span class="fu">getName</span>());
    }
    }
    }

    }

  2. 测试

    由于为了避免.class文件因为保留参数名而导致.class文件过大或者占用更多的内存,另外也避免有些参数(secrect/password)泄露安全信息,JVM即使时1.8默认是不会保留参数名称的。

    所以我们这里正常可以测试编译保留参数名和不保留参数名的情况。

    • 不保留参数名称

      编译命令:

      javac GetRuntimeParameterName.java

      输出结果:

      --------------------
      method: createUser
      return: void
      parameter:java.lang.String, arg0
      parameter:int, arg1
      parameter:int, arg2
    • 保留参数名

      编译命令:

      javac -parameters GetRuntimeParameterName.java

      输出结果:

      --------------------
      method: createUser
      return: void
      parameter:java.lang.String, name
      parameter:int, age
      parameter:int, version

IDE和Maven开启-parameters的办法

Eclipse中开启的办法

Preferences->java->Compiler下勾选Store information about method parameters选项。

这样在使用eclipse编译java文件的时候就会将参数名称编译到class文件中。

Idea中开启的方法

File->Settings->Build,Execution,Deployment->Java Compiler下的Additional command line parameters选项中添加-parameters

Maven中开启的办法

在pom.xml的编译插件中增加参数配置<arg>-parameters</arg>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>

另外附上测试使用Maven install命令编译class文件的情况:

使用maven install编译生成jar包时:

  1. 如果target/classes下class文件对于源码文件都没有修改,不会重新编译,直接打包classes下的class文件;
  2. 如果target/classes下class文件对于源码文件都有修改,会重新编译所有class文件,然后打包classes下的class文件;

Java8获取参数名及Idea/Eclipse/Maven配置的更多相关文章

  1. springMVC源码学习之获取参数名

    1.入口到参数处理调用流程 入口为spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet. ...

  2. eclipse Maven配置以及使用方法

    简述: 现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首 ...

  3. eclipse Maven配置

    ①下载:http://maven.apache.org/download.cgi ②解压至:F:\Study\apache-maven-3.5.2 ③配置环境变量 变量名:M2_HOME 变量值:F: ...

  4. Eclipse Maven 配置setting.xml 的镜像远程仓库

    1.在.m2中新建settings.xml文件 1.window-->Preferences-->Maven-->User Settings 3.点击open file 编辑将远程仓 ...

  5. eclipse maven 配置

    http://www.cnblogs.com/little-YTMM/p/5970878.html

  6. 为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】

    每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用.如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring ...

  7. 使用ASM获得JAVA类方法参数名

    在Java1.8之后,可以通过反射API java.lang.reflect.Executable.getParameters来获取到方法参数的元信息,(在使用编译器时加上-parameters参数, ...

  8. eclipse中配置maven环境

    一.配置setting.xml文件 1.首先将下载好的maven打开,打开文件夹,首先就需要对maven安装目录下有个config文件夹,在文件夹下有settings.xml文件.settings里面 ...

  9. maven配置(安装&使用&私服)文档

    1.Maven 环境搭建 Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK. 系统要求 项目 要求 JDK Maven 3.3 要求 JDK 1.7 或以上 Maven ...

随机推荐

  1. BZOJ2434: [Noi2011]阿狸的打字机(fail树+dfs序)

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  2. Unity实现发送QQ邮件功能

    闲来无聊,用Unity简单实现了一个发送邮件的功能,希望与大家互相交流互相进步,大神勿喷,测试的是QQ邮件用到的是MailMessage类和SmtpClient类首先如果发送方使用的是个人QQ邮箱账号 ...

  3. 王小川分享AI

    王小川的分享:Link

  4. Apache httpd.conf 配置文件语法验证

    Apache 的 httpd.conf文件改动之后,必须重新启动server才干生效. 有时server在提供服务的时候,直接更改配置,重新启动服务.会带来非常大的危急性. 假设能在改动配置之后,先验 ...

  5. Windows环境下ARM集成开发环境的搭建与使用

    Windows环境下能够使用Eclipse IDE for C/C++ Developers来搭建ARM开发环境 本文地址:http://blog.csdn.net/u011833609/articl ...

  6. Google Web Toolkit(GWT) 在windows下环境搭建

    1.什么是GWT? Google Web Toolkit(简称GWT,读作/ˈɡwɪt/),是一个前端使用JavaScript,后端使用Java的AJAX framework,以Apache许可证2. ...

  7. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  8. 看<Asp.net夜话>随笔(2013-10-13)

    1.Asp.net内置对象 1.1Request对象 封装了客户端请求信息 1.2Response对象 代表了服务器响应对象,可以向客户端返回数据 1.3Server对象 是用于获取服务器的相关信息的 ...

  9. 位数(digits)的处理

    主要针对:二进制表示法,以及十进制表示法: 1. 获取位数 已知该数 n 采用十进制进行表示 二进制形式的位数:⌊log2n⌋+1 十进制形式的位数:⌊log10n⌋+1 2. 截断(保留前/后 m ...

  10. HTTP--Request Headers及Cookies

    简介: HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST).如有必要,客户程序还可以选择发送其他的请求头.大多数请求头并不是必需的,但Content-L ...