JAVA反射之构造和域处理
JAVA提供的4种Class的反射构造方法:
Constructor getConstructor(Class[] params)
-- 获得使用特殊的参数类型的公共构造函数,params为相应构造函数参数的Class数组Constructor[] getConstructors()
-- 获得类的所有公共构造函数Constructor getDeclaredConstructor(Class[] params)
-- 获得使用特定参数类型的构造函数(无视修饰符)Constructor[] getDeclaredConstructors()
-- 获得类的所有构造函数(无视修饰符
Constructor
<E>可提供的构造E类型实例的方法:<E>为创建Constructor
实例的类。
E newInstance(Object...arg) -- 获得E的实例,若Constructor
是由getDeclaredConstructor
(...)获得,则私有构造函数也可调用。arg为params相应的实例。
import java.lang.reflect.Constructor;
public class Test1 {
private Test1(String str,Integer in) {
System.out.println(str);
System.out.println(in);
}
public static void main(String[] args) throws Exception {
Class[] cl = new Class[]{String.class,Integer.class}; //建立构造函数所需的参数类型的数组
Constructor<Test1> con = Test1.class.getDeclaredConstructor(cl); //以数组为参数获得Test1的私有构造函数
Object[] ob = new Object[]{"Hello",new Integer(1)}; //建立Test1构造函数所需的参数数组
Test1 t = con.newInstance(ob); //通过构造函数构造Test1实例。
}
}
域的处理:
获得域信息的 Class
反射调用:(Field为java.lang.reflect.Field;)
Field getField(String name)
-- 获得指定name的域Field对象,name为域变量名(必须为public修饰),可以为该Class或它的接口域。Field[] getFields()
-- 获得所有公有修饰的域对象数组Field getDeclaredField(String name)
--可获得私有的域对象Field[] getDeclaredFields()
--获得私有的域对象数组
Field提供各种方法获得域的值,基本数据类型为getInt(Object obj),getByte(Object obj)等,obj -- 含有Field域的原有对象。
引用数据类型可用get(Object obj)获得引用类型的对象(为Object声明)。
Field也提供方法更改域的值,更改后的值直接反应回对象当中,如set(Object obj, Object values).
import java.lang.reflect.Field;
public class Test1 {
private String s;
public int i;
public Test1(String str,Integer in) {
this.s = str;
this.i = in;
}
public static void main(String[] args) throws Exception {
Test1 t = new Test1("H",1);
Field f = t.getClass().getDeclaredField("s");
Object str1 = f.get(t); //获得私有域s;
System.out.println(str1); // ---------------结果“H”
f.set(t, "Hello"); //更改对象t的私有域s的值
System.out.println(f.get(t)); // ---------------结果“Hello"
Field f2 = t.getClass().getField("i");
System.out.println(f2.getInt(t)); //--------结果:1 //域类型必须为int , 不支持Integer。
f2.set(t, 2);
System.out.println(f2.getInt(t));// ----------结果:2
}
}