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

}
}



posted on 2011-10-28 19:29  Topless  阅读(2292)  评论(0编辑  收藏  举报

导航