本篇文章给大家谈谈java获取运行时参数,以及java 运行参数对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、javaWeb程序启动时怎么获取或设置系统参数2、如何在运行期获取method中的参数名3、Java如何获取方法参数的参数名称
javaWeb程序启动时怎么获取或设置系统参数
方法都是想出来的,介绍一种,可以把要在启动时运行的放在一个单独的Servlet的init()方法中 在web.xml中配置这个servlet的load-on-startup 属性值大于等于0就行了,如果小于0或不设置则是在访问此servlet时才加载至于设置为几如果要优先其他执行那就设置的低些,相反就设置高些程序启动时会根据load-on-startup的值由低到高顺序加载
如何在运行期获取method中的参数名
因为一次在做项目的时候需要扫描接口的信息,其中包括参数名,遇到了点障碍就想着把这个解决方案和问题讲一下。
我们要查看的方法如下
java1.8以后,官方提供了反射的方法能获取到接口的参数名称。示例如下。其中getParameters方法是1.8才开始提供的。并且需要在javac编译时,加上-parameters参数才行。
通过javap -p -v可以查看class的字节码,如下
其中MethodParameters就是1.8后在字节码中记录参数名的地方。但是1.8之前是怎么实现的呢?
spring中有个ParameterNameDiscoverer接口,他有6个实现类。如下:
Aspect开头的都是对增强类的信息获取。我用不到。
PrioritizedParameterNameDiscoverer是一个链表,就是记录一系列的Discoverer。
这个Discoverer就是封装了JDK1.8的getParameters
这个类是重点,它通过asm获取了class文件的LocalVariableTable信息。class,字节码如下:
其中有一行字节码记录了LocalVariableTable信息,LocalVariableTable里不仅保存了参数名,还保存了其他局部变量信息。spring通过slot来判定哪些是参数以及参数的顺序。
但是LocalVariableTable不是类的必须信息,所以不是编译后必须存在的。只有在javac时-g或-g:vars时,才会保存LocalVariableTable信息。
在idea工具中,我们可以通过如下方式,关闭编译时,自动生成LocalVariableTable来尝试查看字节码。
这个Discoverer就是在1.8时多添加了个StandardReflectionParameterNameDiscoverer。
在ParameterNameDiscoverer接口上有这么段注释:
它告诉我们,不是任何时候都能获取到参数名的,只能尝试去获取。
当我们关闭了class debug信息,并且将编译级别设置为1.6时,启动一个简单的spring boot项目。在idea中关闭操作如下:
controller如下:
我们会发现这时候访问该接口传递info参数会报如下错误:
所以,spring mvc中也是有可能获取不到方法参数名的。如果我们需要使用spring mvc的话,最好通过Require等注解来绑定。
Java如何获取方法参数的参数名称
package com.mikan;
import java.lang.annotation.*;
/**
* @author Mikan
* @date 2015-08-04 23:39
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Param {
String value();
}
获取注解中的参数名的工具类:
package com.mikan;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
* @author Mikan
* @date 2015-08-05 00:26
*/
public class ParameterNameUtils {
/**
* 获取指定方法的参数名
*
* @param method 要获取参数名的方法
* @return 按参数顺序排列的参数名列表
*/
public static String[] getMethodParameterNamesByAnnotation(Method method) {
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
if (parameterAnnotations == null || parameterAnnotations.length == 0) {
return null;
}
String[] parameterNames = new String[parameterAnnotations.length];
int i = 0;
for (Annotation[] parameterAnnotation : parameterAnnotations) {
for (Annotation annotation : parameterAnnotation) {
if (annotation instanceof Param) {
Param param = (Param) annotation;
parameterNames[i++] = param.value();
}
}
}
return parameterNames;
}
}
测试类:
package com.mikan;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* @author Mikan
* @date 2015-08-04 23:40
*/
public class ParameterNameTest {
public void method1(@Param(“parameter1”) String param1, @Param(“parameter2”) String param2) {
System.out.println(param1 + param2);
}
public static void main(String[] args) throws Exception {
ClassParameterNameTest clazz = ParameterNameTest.class;
Method method = clazz.getDeclaredMethod(“method1”, String.class, String.class);
String[] parameterNames = ParameterNameUtils.getMethodParameterNamesByAnnotation(method);
System.out.println(Arrays.toString(parameterNames));
}
}
关于java获取运行时参数和java 运行参数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。