Java 8能够使用Reflection API获取方法参数名称.
如何获取这些方法参数名称?
据我所知,类文件不存储正式的参数名称.我如何使用反射获得这些?
在Java 6中,想象一下我有以下方法签名:
public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard)
Run Code Online (Sandbox Code Playgroud)
我想知道,在运行时,传递给slice2或任何其他参数的值,这里重要的一点是我想通过参数名称获取值.
我知道如何用getParameterTypes或获取参数类型列表getGenericParameterTypes.
理想情况下,我想获得一个参数名称列表而不是类型.有办法吗?
我有一个Gradle管理的多项目设置,它依赖于新的Java 8 -parameters编译器标志.我需要2种方法来包含编译器标志:
我试过这个:
tasks.withType(JavaCompile) {
options.compilerArgs << '-parameters'
options.fork = true
options.forkOptions.executable = 'javac'
}
Run Code Online (Sandbox Code Playgroud)
......但它似乎没有正常工作.
我正在编写小而非常DRY的框架,它严重依赖于元数据.我想知道是否有办法获取方法参数名称,即给定一些方法
public void a(int myIntParam, String theString) { ... }
Run Code Online (Sandbox Code Playgroud)
得到字符串"myIntParam"和"theString".
我知道我可以注释参数,但这不会很好......
public void a(
@Param("myIntParam") int myIntParam,
@Param("theString") String theString
) { ... }
Run Code Online (Sandbox Code Playgroud) 说我以某种方式获得了来自其他类的对象引用:
Object myObj = anObject;
Run Code Online (Sandbox Code Playgroud)
现在我可以得到这个对象的类:
Class objClass = myObj.getClass();
Run Code Online (Sandbox Code Playgroud)
现在,我可以得到这个类的所有构造函数:
Constructor[] constructors = objClass.getConstructors();
Run Code Online (Sandbox Code Playgroud)
现在,我可以循环每个构造函数:
if (constructors.length > 0)
{
for (int i = 0; i < constructors.length; i++)
{
System.out.println(constructors[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
这已经给了我构造函数的一个很好的总结,例如构造函数public Test(String paramName)显示为public Test(java.lang.String)
但是,我想获取参数的名称,而不是给我类类型.在这种情况下,"paramName".我该怎么办?我尝试了以下但没有成功:
if (constructors.length > 0)
{
for (int iCon = 0; iCon < constructors.length; iCon++)
{
Class[] params = constructors[iCon].getParameterTypes();
if (params.length > 0)
{
for (int iPar = 0; iPar < params.length; iPar++)
{
Field fields[] = params[iPar].getDeclaredFields();
for (int iFields …Run Code Online (Sandbox Code Playgroud) 我正在使用的API决定接受UUID作为Base32编码的字符串,而不是UUID.fromString()期望的标准十六进制,破折号分隔格式.这意味着我不能简单地写@QueryParam UUID myUuid为方法参数,因为转换会失败.
我正在解决这个问题,通过使用不同的fromString转换器编写自定义对象以与Jersey @QueryString和@FormParam注释一起使用.我希望能够访问fromString方法中的转换上下文,以便我可以提供更好的错误消息.现在,我所能做的就是以下几点:
public static Base32UUID fromString(String uuidString) {
final UUID uuid = UUIDUtils.fromBase32(uuidString, false);
if (null == uuid) {
throw new InvalidParametersException(ImmutableList.of("Invalid uuid: " + uuidString));
}
return new Base32UUID(uuid);
}
Run Code Online (Sandbox Code Playgroud)
我希望能够公开哪个参数具有无效的UUID,因此我记录的异常和返回的用户错误非常清楚.理想情况下,我的转换方法会有一个额外的参数用于细节,如下所示:
public static Base32UUID fromString(
String uuidString,
String parameterName // New parameter?
) {
final UUID uuid = UUIDUtils.fromBase32(uuidString, false);
if (null == uuid) {
throw new InvalidParametersException(ImmutableList.of("Invalid uuid: " + uuidString
+ …Run Code Online (Sandbox Code Playgroud) 我知道如果参数看起来像这样:
@RequestParam("userId") String userId
Run Code Online (Sandbox Code Playgroud)
我可以通过调用这个获得值:
requestParam.value()
Run Code Online (Sandbox Code Playgroud)
但是如果我没有指定名称,Spring会自动使用变量名.像这样:
@RequestParam String userId
Run Code Online (Sandbox Code Playgroud)
如果未指定param名称,我该如何访问它?我知道它可能因为Spring以某种方式做到了,但在这种情况下requestParam.value()是空白的.
我有一个方面基于目标方法的细节进行各种计算,因此提前提取这些如下:
@Around("execution(* com.xyz.service.AccountService.*(..))")
public void validateParams(ProceedingJoinPoint joinPoint) throws Throwable {
final MethodSignature signature = (MethodSignature) joinPoint.getSignature();
final String methodName = signature.getName();
final String[] parameterNames = signature.getParameterNames();
final Object[] arguments = joinPoint.getArgs();
...
...
...
joinPoint.proceed();
}
Run Code Online (Sandbox Code Playgroud)
在提取的细节中,所有细节都反映了除了始终返回null的parameterNames之外的预期信息.我希望它按照下面的签名返回{accountDetails}.谁会知道我可能会遗漏什么,或者这是一个错误?
这是我正在反对的目标方法的签名:
Long createAccount(RequestAccountDetails accountDetails);
Run Code Online (Sandbox Code Playgroud) 已经好几个月了,我对 Java 越来越青睐 Python。现在我要回到java来处理项目约束。现在,我想知道是否有一种方法可以在函数本身内部以编程方式获取函数的所有参数(带值)。
像这样的东西
public void foo(String arg1,String arg2, Integer arg3){
... pars = ...getpars();
}
foo("abc","dfg",123);
Run Code Online (Sandbox Code Playgroud)
wheregetpars()应该返回一个HashMapwithname,value对。
所以从例子来看应该是
arg1,"abc"
arg2,"dfg"
arg3,123
Run Code Online (Sandbox Code Playgroud)
有这样的事吗?
我需要在运行时获取方法的参数名称.有没有办法实现这个目标?
我尝试使用LocalVariableTableParameterNameDiscoverer哪个是Spring类.但它只适用于类而不是接口.
我有一个方法
public void create(String x, String y, String z, Calendar a, Calendar b, Calendar c, List<String> d){
object.create(x, y, z, a, b, c, d);
}
Run Code Online (Sandbox Code Playgroud)
通过几个管理类传递.有没有办法避免我必须在object.create调用中显式键入参数,而是允许我简单地引用方法自己的参数?
我问这个的原因是因为我有几个这样的方法,看起来很混乱.
请注意参数是不同类型的,它们仍应按此定义,而不是Object... args.
java ×10
reflection ×5
parameters ×3
annotations ×2
methods ×2
spring ×2
aop ×1
aspectj ×1
constructor ×1
gradle ×1
java-6 ×1
java-8 ×1
javac ×1
jax-rs ×1
jersey ×1
reference ×1
runtime ×1