在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. BZOJ3672: [Noi2014]购票(CDQ分治,点分治)

    Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.        全国的城市构成了一棵以SZ市为根的有根树 ...

  2. 【2017 Multi-University Training Contest - Team 6】Classes

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6106 [题意] 给出选 A,B,C,AB,AC,BC,ABC 课程的学生,其中 AB 是 A 和 B 都 ...

  3. 【SonicUI】关于字体高亮的问题。。

    m_pSonicString[1]->Format(_T("/c=%x, a='http://hi.csdn.net/', linkh=0xFF00F0, font, font_hei ...

  4. Spark SQL概念学习系列之Spark SQL基本原理

    Spark SQL基本原理 1.Spark SQL模块划分 2.Spark SQL架构--catalyst设计图 3.Spark SQL运行架构 4.Hive兼容性 1.Spark SQL模块划分 S ...

  5. 开发过程使用Tomcat Maven插件持续快捷部署Web项目

    我在平时工作中部署Web项目到测试服务器上的Tomcat时用的是Hudson.Hudson本身已经跟SVN.Git.Maven集成并且支持添加各种插件.但如果使用Hudson,我需要配置两个任务:一个 ...

  6. 洛谷—— P1765 手机_NOI导刊2010普及(10)

    https://www.luogu.org/problem/show?pid=1765#sub 题目描述 一般的手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 ...

  7. php中嵌套html代码和html代码中嵌套php方式

    php中嵌套html代码和html代码中嵌套php方式 一.总结 拷贝的话直接html代码是极好的方式 1.php中嵌套html代码(本质是原生php):a.原生嵌套<?php .....?&g ...

  8. 每日技术总结:promise,express route,评分,local storage商品浏览历史,

    最近正在用Vue做一个电商项目.利用工作前后空隙时间. 1.promise的使用 点这里 如何在实际项目中使用Promise 2. Express Route 前后端传参的两种方法 (1)req.pa ...

  9. 如何获取AppStore软件安装包的路径

    本帖最后由 chinald 于 2015-10-16 13:59 编辑 前言:本文介绍在Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用,希望对大家有所帮助(前提:想要提取 ...

  10. IQMath是什么 浮点转定点运算,dsp

    [转帖注明出处:blog.csdn.net/lanmanck] 网上搜了一下没发现非常合适的,特写出来与大家分享. 大家都知道嵌入式系统里带浮点运算指令的CPU都比較少,TI的DSP也是定点的廉价. ...