相关疑难解决方法(0)

我可以使用Java反射获取方法参数名吗?

如果我有这样的课程:

public class Whatever
{
  public void aMethod(int aParam);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法知道,aMethod使用一个名为参数aParam,即类型的int

java reflection

116
推荐指数
6
解决办法
11万
查看次数

如何获取对象构造函数的参数名称(反射)?

说我以某种方式获得了来自其他类的对象引用:

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)

java reflection parameters constructor

17
推荐指数
3
解决办法
2万
查看次数

在intellij 13中存储有关方法参数的信息(可通过反射使用)

有没有人知道Eclipse 4.4的商店信息有关Intellij Idea 13中的方法参数(可通过反射使用)编译器属性(或者更旧,但我怀疑它是否可用)?

编辑:此链接显示如何使用maven,但我仍然想知道如何在Idea 运行Eclipse中使用M2 Maven构建忽略"存储方法参数名称"定义

java eclipse intellij-idea maven

9
推荐指数
1
解决办法
3176
查看次数

如何在java 8 lambda表达式中获取方法参数名称?

如何获得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)

java lambda java-8

5
推荐指数
1
解决办法
1997
查看次数

获取当前或调用方法的java.lang.reflect.Executable?

如何从代码中表示的语言功能的特定实例中获取以下类型的对象:

  • java.lang.reflect.Executable
  • java.lang.reflect.Parameter

理想地,提供方法将是获取方法或获取方法本身的调用者.

请注意,我在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)

java reflection java-8

5
推荐指数
1
解决办法
365
查看次数