我正在尝试学习如何使用反射来打印出类的字段,方法和构造函数。以下是有问题的代码:
static void displayMethodInfo(Object obj){
Class c = obj.getClass();
System.out.println(c + "{");
int mods;
Field fields[] = c.getDeclaredFields();
for(Fields f : fields){
if(!Modifier.isPrivate(f.getModifiers()))
System.out.println("\t" + f);
}
Constructor [] constructors = c.getConstructors();
for(Constructor con : constructors){
System.out.println("\t" + con);
}
Method methods[] = c.getDeclaredMethods();
for(Method m : methods){
if(!Modifier.isPrivate(m.getModifiers()))
System.out.println("\t" + m);
}
System.out.println("}");
}
我为Field获取的错误与我为构造函数和方法获得的错误相同:
MethodInfoTest.java:11: cannot find symbol
symbol : class Field
location: class MethodInfoTest
Field fields[] = c.getDeclaredFields();
^
MethodInfoTest.java:12: cannot find symbol
symbol : class Fields
location: class MethodInfoTest
for(Fields f : fields){
我相信我使用的是正确的API,我使用的是import java.lang。*;我认为我们需要使用Field,Method和Constructor。关于我们如何使用这些类型,我是否有些误导?
答案 0 :(得分:5)
使用星号导入不会导入子包。 Field
,Method
和Constructor
是 java.lang.reflect 的成员。
答案 1 :(得分:1)
你应该使用:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
答案 2 :(得分:1)
将来使用正确的IDE并按下一些称为“组织导入”的关键字,它将使用导入为您修复所有内容。
答案 3 :(得分:0)
使用以下导入语句。
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.Method;
另外,我认为Fields
不是Reflection API中的类。
我的建议是尝试使用IDE,它会建议可能的编译问题。
答案 4 :(得分:0)
你需要:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
考虑使用IDE,例如Eclipse。