我正在编写小而非常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
这是一个需要一些调整的脏解决方案.也许有人可以做得更好.
要求您知道已编译的类文件的位置.
它必须使用-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
不是真的,但是codehaus有这个库可以用于很多目的:http://paranamer.codehaus.org/
我可能错了...但我不认为参数名称出现在类文件中,所以我猜想没有办法通过反射来获取它们.