当前位置:  开发笔记 > 编程语言 > 正文

有没有办法在Java中获取方法参数的名称?

如何解决《有没有办法在Java中获取方法参数的名称?》经验,为你挑选了3个好方法。

我正在编写小而非常DRY的框架,它严重依赖于元数据.我想知道是否有办法获取方法参数名称,即给定一些方法

public void a(int myIntParam, String theString) { ... }

得到字符串"myIntParam""theString".

我知道我可以注释参数,但这不会很好......

public void a(
    @Param("myIntParam") int myIntParam,
    @Param("theString") String theString
) { ... }

Jonny Hegghe.. 15

这是一个需要一些调整的脏解决方案.也许有人可以做得更好.

缺点:

要求您知道已编译的类文件的位置.

它必须使用-g标志进行编译.

码:

import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.LocalVariable;
import com.sun.org.apache.bcel.internal.classfile.Method;
import java.io.IOException;

public class Main {

  public static void main(String[] args) throws IOException {
      ClassParser parser = new ClassParser("Main.class");
      JavaClass clazz = parser.parse();

      for (Method m : clazz.getMethods()) {
          System.out.println("Method: " + m.getName());
          int size = m.getArgumentTypes().length;
          if (!m.isStatic()) {
            size++;
          }

          for (int i = 0; i < size; i++) {
              LocalVariable variable = m.getLocalVariableTable().getLocalVariable(i);
              System.out.println("  - Param: " + variable.getName());
          }
      }
  }

  public void a(int myIntParam, String theString) {
  }
}

输出:

$ javac -g Main.java
$ java Main
Method:
- Param: this
Method: main
- Param: args
Method: a
- Param: this
- Param: myIntParam
- Param: theString



1> Jonny Hegghe..:

这是一个需要一些调整的脏解决方案.也许有人可以做得更好.

缺点:

要求您知道已编译的类文件的位置.

它必须使用-g标志进行编译.

码:

import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.LocalVariable;
import com.sun.org.apache.bcel.internal.classfile.Method;
import java.io.IOException;

public class Main {

  public static void main(String[] args) throws IOException {
      ClassParser parser = new ClassParser("Main.class");
      JavaClass clazz = parser.parse();

      for (Method m : clazz.getMethods()) {
          System.out.println("Method: " + m.getName());
          int size = m.getArgumentTypes().length;
          if (!m.isStatic()) {
            size++;
          }

          for (int i = 0; i < size; i++) {
              LocalVariable variable = m.getLocalVariableTable().getLocalVariable(i);
              System.out.println("  - Param: " + variable.getName());
          }
      }
  }

  public void a(int myIntParam, String theString) {
  }
}

输出:

$ javac -g Main.java
$ java Main
Method:
- Param: this
Method: main
- Param: args
Method: a
- Param: this
- Param: myIntParam
- Param: theString



2> GaryF..:

不是真的,但是codehaus有这个库可以用于很多目的:http://paranamer.codehaus.org/



3> bobwienholt..:

我可能错了...但我不认为参数名称出现在类文件中,所以我猜想没有办法通过反射来获取它们.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有