在Java中,反射是指程序在运行期可以拿到一个对象的所有信息,也就是Reflection。
在正常情况下,我们如果要调用一个对象的方法,或者访问一个对象的字段,通常都会传入对象实例:
如果不能获得User类,只有一个Object实例,这样子就无法获取到它里面的字段了。
这个时候,就要用到反射了
首先我先获取User的Class实例,然后,分别获取public字段、继承的public字段以及private字段,打印出Field
这个Field对象包含了一个字段的所有信息。
getName():返回字段名称,例如,userName;
getType():返回字段类型,也是一Class个实例,例如,String.Class;
getModifiers():返回字段的修饰符,它是一个int,不同的bit表示不同的含义。
我们现在用反射来获取password这个字段的信息。
Field f = String.class.getDeclaredField("value");
f.getName(); // "value"
f.getType(); // class [B 表示byte[]类型
int m = f.getModifiers();
Modifier.isFinal(m); // true
Modifier.isPublic(m); // false
Modifier.isProtected(m); // false
Modifier.isPrivate(m); // true
Modifier.isStatic(m); // false
利用反射拿到字段的一个Field实例只是第一步,我们还可以拿到一个实例对应的该字段的值。
例如,对于一个Test1实例,我们可以先拿name字段对应的Field,再获取这个实例的name字段的值: