package com.javase.reflect; import java.lang.reflect.Field; /** * 通过反射机制,访问java对象的属性,给属性赋值,读取属性的值(重点:五颗星*****) * 本例中使用反射机制编写代码,看起来比不使用反射机制编写代码较复杂,但是灵活性增强了,这也是值得的。 * (本代码需要经常看一看,多理解,将来学习架构的时候有利于理解) */ public class ReflectText08五颗星 { public static void main(String[] args) { try { // 通过完整类名获取到该类(完整类名的获取见下图) Class studentClass = Class.forName("com.javase.bean.Student"); // 实例化对象 /* 这里的obj就是Student类的实例化对象,newInstance()方法底层调用了Student类的无参数构造方法,为此必须保证在Student 类中提供了无参构造方法,如果此类中没有无参构造方法,那么该行代码在运行中就会报异常。 */ Object obj = studentClass.newInstance(); // 获取no属性(根据属性的名称来获取Field) Field noField = studentClass.getDeclaredField("no"); // 给对象obj(也就是Student对象)的no属性赋值 /** * 虽然使用了反射机制,但是三要素还是缺一不可 * 要素1:对象obj * 要素2:属性名no * 要素3:属性值55555 */ noField.set(obj,55555); // 获取对象obj(也就是Student对象)的no属性的值 System.out.println(noField.get(obj)); // 私有的属性也可以访问,但是需要打破封装 Field nameField = studentClass.getDeclaredField("name");//获取name属性 nameField.setAccessible(true);//打破封装,这样操作以后就可以访问private修饰的私有属性 // 给name属性赋值 nameField.set(obj,"张三"); // 获取name属性 System.out.println(nameField.get(obj)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }
/*
程序运行结果:
55555
张三
*/