3 java reflection encapsulation
与此问题类似,我需要访问POJO的一个实例的所有私有字段.不同之处在于我不知道我想要的领域的具体名称.
例如,如果我的POJO是:
public class Widget {
private java.lang.String fizz;
private java.lang.Boolean buzz;
private com.me.myapp.Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来检查一个Widget实例(或类本身)并看到它有这三个字段/类型,而不知道它们的名字/类型提前.
这可能吗?如果是这样,怎么样?如果没有,为什么?
更新:
System.out.println("classToInspect = " + classToInspect.getName() + ", and fields are:\n");
for(Field f : allFields)
System.out.println(f.getType());
Run Code Online (Sandbox Code Playgroud)
打印:
classToInspect = com.myorg.myapp.LoggerConfig, and fields are:
int
int
int
class java.lang.reflect.Constructor
class java.lang.Class
class java.lang.String
class java.security.ProtectionDomain
boolean
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
int
int
class sun.reflect.generics.repository.ClassRepository
long
class [Ljava.io.ObjectStreamField;
class sun.reflect.ReflectionFactory
boolean
class [Ljava.lang.Object;
interface java.util.Map
class [Ljava.lang.annotation.Annotation;
interface java.util.Map
interface java.util.Map
class sun.reflect.annotation.AnnotationType
Run Code Online (Sandbox Code Playgroud)
请注意:这些字段都不是我实际LoggerConfig课程的字段/属性/成员; 他们必须通过反思或Object超级班级的一部分来提供/补充......
您可以使用类的getDeclaredFields方法Class来获取类中声明的所有字段,而不管其修饰符如何。使用该getDeclaredFields方法将为您提供一个 数组Field,然后您可以对其进行迭代,并调用该getType方法以获取字段的类型。以下代码演示了相同的内容:
class TestClass
{
private String x;
private int y;
private boolean z;
}
public class Test
{
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException
{
Class clazz = TestClass.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields)
{
System.out.println("fieldName: "+field.getName()+", fieldType: "+field.getType());
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码输出:
fieldName: x, fieldType: class java.lang.String
fieldName: y, fieldType: int
fieldName: z, fieldType: boolean
Run Code Online (Sandbox Code Playgroud)
使用下面列出所有私人字段
List<Field> privateFields = new ArrayList<>();
Field[] allFields = SomeClass.class.getDeclaredFields();
for (Field field : allFields) {
if (Modifier.isPrivate(field.getModifiers())) {
privateFields.add(field);
System.out.format("type is", field.getType());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6662 次 |
| 最近记录: |