java反射学习--操作私有成员 (三)

2014-11-24 10:36:25 · 作者: · 浏览: 2

public static void main(String[] args) throws Exception {

int n=100;

String str = "I love java";

String[] sArr = new String[]{"xiaoming","xiaohong","zhangsan"};

List list = new ArrayList();//0 1 2

for(int i=0;i<3;i++){
list.add(i);
}

Class clazz = DataType.class;

//获取默认的构造方法对象
Constructor cons = clazz.getConstructor(new Class[]{});
//运行不带参数的构造方法,创建对象实例
DataType dataType = cons.newInstance(new Object[]{});
//获取所有的字段
Field[] fields = clazz.getDeclaredFields();

//为每一个字段赋值
for(Field field : fields){
//首先设置该字段的可访问性
field.setAccessible(true);

if(field.getType().getSimpleName().equals("int")){
field.set(dataType, n);
}else if(field.getType().getSimpleName().equals("String")){
field.set(dataType, str);
}else if(field.getType().getSimpleName().equals("String[]")){
field.set(dataType, sArr);
}else if(field.getType().getSimpleName().equals("List")){
field.set(dataType, list);
}
}

//获取toString方法
Method toStringMethod = clazz.getMethod("toString", new Class[]{});

Object result = toStringMethod.invoke(dataType, new Object[]{});

System.out.println(result);



}
}
输出结果:int n=100 String str=I love java String[] sArr=xiaoming xiaohong zhangsan List list=0 1 2


如果用带参数的构造方法来完成相同的功能,


[java]
//获取带参数的构造方法对象
Constructor cons2 = clazz.getConstructor(new Class[]{int.class,String.class,String[].class,List.class});

DataType dataType2 = cons2.newInstance(new Object[]{n,str,sArr,list});

Object result2 = toStringMethod.invoke(dataType2, new Object[]{});

System.out.println(result2);

//获取带参数的构造方法对象
Constructor cons2 = clazz.getConstructor(new Class[]{int.class,String.class,String[].class,List.class});

DataType dataType2 = cons2.newInstance(new Object[]{n,str,sArr,list});

Object result2 = toStringMethod.invoke(dataType2, new Object[]{});

System.out.println(result2);

输出结果:int n=100 String str=I love java String[] sArr=xiaoming xiaohong zhangsan List list=0 1 2

[java]