反射机制看自省(探寻类自身的信息--修改类的信息)
反射机制看自省(探寻类自身的信息--修改类的信息)
public class TestReflection_2 {public static void main(String[] args) throws Exception {/** * 修改类的属性的值 * */Object object = new StudentT("Michael",24);Class cls = object.getClass();//属性Field[] fs = cls.getDeclaredFields();for(Field f:fs){f.setAccessible(true);//可以在虚拟机中使用安全策略来屏蔽掉这种机制System.out.println("\t" + f.getName() + " : " + f.get(object));//如果这样写是会报错的,因为有的属性是private//改变属性的值if(f.getType().getSimpleName().equals("String")){f.set(object, "Bryant");}else if(f.getType().getSimpleName().equals("int")){f.set(object, 23);}System.out.println("\t" + f.getName() + " : " + f.get(object));//如果这样写是会报错的,因为有的属性是private}//方法//---->Method[] methods = cls.getMethods();//得到所有方法Class[] params = {String.class, int.class};Method method = cls.getMethod("study", params);//调方法的时候,我们要放入方法体中的是一个实参,应该是一个对象数组Object[] objs = {"Core Java", new Integer(6)};Object o = method.invoke(object, objs);System.out.println("\t" + o);//构造方法 Construtctor, 通过类对象,其本身就可以调用newInstance()方法来创建类的对象//这个的意思是说,类在创建的时候必须要含有一个无参的构造方法//那是不是说,如果没有无参构造方法,就不能利用发射来创建对象了呢?//答案是否定的//这个时候 你需要做的是首先利用反射拿到(怎么拿,还是用参数表)有参的那个构造方法,//使用参数表的时候,利用getConstructor()这个方法拿到构造方法对象,//然后用构造方法的这个对象调用newInstance()方法,这样就可以得到你想要的对象了}}class StudentT{private String name;private int age;//public String hobby;//构造方法public StudentT(){}public StudentT(String name, int age){this.name = name;this.age = age;}public void study(){System.out.println("StudentT " + name +" studies");}public String study(String course, int time){System.out.println("\t" + "StudentT " + name +" studies " + course +" " + time + " times" );if(time >=3)return "Good";return "Bad";}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}/*public void setHobby(String hobby) {this.hobby = hobby;}*/}