学习Java(81)_使用反射调用成员属性

类中的属性一定要在本类实例化对象产生之后成才可以分配内存空间,在class类中提供取得成员的方法。
取得全部成员:
public Field[] getDeclaredFields() throws SecurityException
取得指定成员:
public Field getDeclaredField(String name) throws NoSuchFieldException,  SecurityException
返回的类型是 java.lang.reflect.Field 该类中有两个重要方法:
取得属性内容:
public Object get(Object obj) throws IllegalArgumentException,
IllegalAccessException
设置属性内容:
public void set(Object obj, Object value) throws IllegalArgumentException,  IllegalAccessException
在 java.lang.reflect.AccessibleObject 类下面(JDK 1.8 之后修改)
Executable:下面继续继承了Constructor、Method;
Field
在这个类里面提供有一个方法来指定封装是否取消:
public void setAccessible( boolean flag ) throws SecurityException
范例:
import java.lang.reflect.*;
class Book
{
	private String name;
}
class TestField
{
	public static void main( String[] args ) throws Exception
	{
		Class<?> cls = Class.forName( "Book" );
		Object obj = cls.newInstance();
		Field bookField = cls.getDeclaredField( "name" );
		bookField.setAccessible( true ); //设置访问权限
		bookField.set( obj, "一本好书!" ); //设置字段信息
		System.out.println( bookField.get( obj ) ); //获取字段信息
	}
}
/*
	在JDK1.8.0_91中运行的结果是:
	============================
	E:\textjava>java TestField
	一本好书!
	============================
	总结:
		setAccessible()可以设置访问权限。
*/
构造方法和普通方法也同样可以取消封装,只不过很少这样做,对于属性的访问还是建议使用set,get去做。


小艾的博客 http://www.aixinyan.me/