在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. BZOJ2402: 陶陶的难题II(树链剖分,0/1分数规划,斜率优化Dp)

    Description Input 第一行包含一个正整数N,表示树中结点的个数.第二行包含N个正实数,第i个数表示xi (1<=xi<=10^5).第三行包含N个正实数,第i个数表示yi ...

  2. numpy_basic

    一.Numpy是什么 Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力. Numpy是其它数据分析及机器学习库的底层库. Numpy完全标准C语言实现, ...

  3. win7打不开chm格式文件

           近期在开发的过程中,发现重装的系统Wind7 打不开java帮助文档.搜索了半天才找到. 在这里分享一下. 一.假设不能打开,可这样恢复文件关联: 1.開始执行,输入:regsvr32 ...

  4. eclipse-hierarchyviewer 不能使用

    今天安装了adt-bundle以后,发现hierarchyviewer不能用.点开了以后连手机没有效果.后来发现,还需要进入hierarchyviewer所在的sdk目录进行下权限的设置 chmod ...

  5. 1.1 Introduction中 Kafka as a Storage System官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka as a Storage System kafka作为一个存储系统 An ...

  6. 洛谷 P1206 [USACO1.2]回文平方数 Palindromic Squares

    P1206 [USACO1.2]回文平方数 Palindromic Squares 题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2< ...

  7. WCF REST (二)

    今天主要写下  POST等其他方式 发送请求 以及 流方式 文件的上传与下载 一.Post 提交数据 先来想下 POST和Get 的不同   Get 方式 我们直接通过 url  来传递参数   先来 ...

  8. [D3] Margin Convention with D3 v4

    You can’t add axes to a chart if you don’t make room for them. To that end, the D3 community has ado ...

  9. BZOJ 3038 上帝造题的七分钟2 树状数组+并查集

    题目大意:一个序列,有两种操作.1.将一段数中的每个数开根号.2.查询一段数的和. 思路:和3211是一个题,有兴趣的能够看看我的那篇博客. CODE: #include <cmath> ...

  10. python3中numpy函数tile的用法

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...