如果我有这样的课程:
public class Whatever
{
public void aMethod(int aParam);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法知道,aMethod使用一个名为参数aParam,即类型的int?
说我以某种方式获得了来自其他类的对象引用:
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) 有没有人知道Eclipse 4.4的商店信息有关Intellij Idea 13中的方法参数(可通过反射使用)编译器属性(或者更旧,但我怀疑它是否可用)?
编辑:此链接显示如何使用maven,但我仍然想知道如何在Idea 运行Eclipse中使用M2 Maven构建忽略"存储方法参数名称"定义
从如何获得Java中8的方法参数名称使用反射?
我知道使用javac -parameters参数可以将参数名保存在*.class文件中.但它在lambda表达式中无效?
例:
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class MyTest {
public static void main(String[] args) {
for(Method m : Test.class.getDeclaredMethods()) {
System.out.println(m.getName());
for(Parameter p : m.getParameters()) {
System.out.println(" => " + p.getName());
}
}
}
}
interface MyInterface {
Object doSomething(int a, int b);
}
class Test {
private void bar(MyInterface iface) {
}
public void foo() {
bar((x, y) -> null);
}
}
Run Code Online (Sandbox Code Playgroud)
当我做
javac -parameters MyTest.java
java MyTest
Run Code Online (Sandbox Code Playgroud)
它打印
bar
=> iface
foo …Run Code Online (Sandbox Code Playgroud) 如何从代码中表示的语言功能的特定实例中获取以下类型的对象:
理想地,提供方法将是获取方法或获取方法本身的调用者.
请注意,我在SO上找到了两种答案:
两者都没有帮助获取名称不唯一的特定方法的参数.
特别考虑一下这个答案和这个问题如何对所选方法的选择产生影响.
现在,存在,Class.getMethod(String, Class<?>... types)但似乎没有人可以从现有的方法定义自动生成"类型"参数?
使用案例:
public class MyAssertions
{
private static final String DEFAULT_MESSAGE_NOT_NULL = "Parameter must not be null: ";
/* Ideal. */
public static void notNull(Object ref, Parameter param)
{
if(ref == null)
throw new IllegalArgumentException(DEFAULT_MESSAGE_NOT_NULL + param.getName());
}
/* Still okay. */
public static void notNull(Object ref, Executable caller, int param)
{
if(ref == null)
throw new IllegalArgumentException(DEFAULT_MESSAGE_NOT_NULL
+ caller.getParameters()[param].getName());
}
/* Hell …Run Code Online (Sandbox Code Playgroud)