2.4反射调用类中属性Field(描述类中普通属性)
- 第一组(父类中)-取得类中全部属性:
A.public Field[]getFields()throws SecurityException
B.public Field[]getDeclaredFields() throws SecurityException
- 第一组(父类中)-取得类中指定名称属性:
A.public Field getField(String name)
throwsNoSuchFieldException, SecurityException
B.public Field getDeclaredField (String name)
throwsNoSuchFieldException, SecurityException:可以取得类中全部普通属性,包含私有属性
Field类提供设置与取得属性方法
设置属性:
public void set(Object obj, Object value)
取得属性:
public Object get(Object obj)
取得属性的类型:
Public Class<?> getType()
上代码:
import java.lang.reflect.Field;
import java.util.Date;
class Person{
public int age;
}
public class wl {
public static void main(String[] args) throws Exception {
Class<Person> cls= Person.class;
//1.取得Filed对象
Field field=cls.getField ("age");
//2.取得Person 实例化对象
Person per=cls.newInstance ();
//3.set&get
field.set (per,18);
System.out.println (field.get (per));
System.out.println (field.getType ());
}
}
结果:
18
int
Process finished with exit code 0
2.5动态破坏封装:(反射的特性)
Constructor,Field,Method类都是AccessibleObject子类。
AccessibleObject提供动态设置封装方法(在本次JVM进程中有效且只能通过反射调用)
public void setAccessible(boolean flag) throws SecurityException
setAccessible(ture)动态破坏封装:在一次JVM进程中仅能通过反射调用
import java.lang.reflect.Field;
class Person{
private int age;
}
public class wl {
public static void main(String[] args) throws Exception {
Class<Person> cls= Person.class;
//1.取得Filed对象
Field field=cls.getDeclaredField ("age");
//2.取得Person 实例化对象
Person per=cls.newInstance ();
//3.set&get
field.setAccessible (true);
field.set (per,18);
System.out.println (field.get (per));
System.out.println (field.getType ());
}
}