Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象
传入一个包名+类名的字符串就可以得到Class对象
第一步:获得对象,构造方法,普通方法,属性
Object obj = cls.newInstance() //反射实例化对象 Constructor<?> cons = cls.getConstructor(String.class, int.class);//获得构造方法 Method m3 = cls.getDeclaredMethod("getName"); //获得get方法 Field nameField = cls.getDeclaredField("name"); // 获得name属性
第二步:获得之后---如何用的问题1. 虽然用此方法创造的对象比new出来的复杂,但是有利于程序的解耦,增加扩展性
8/22框架技术都是通过此技术进行解耦操作的
2. Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象
Constructor<?> cons = cls.getConstructor(String.class, int.class);
Object obj = cons.newInstance("张三", 20); // 为构造方法传递参数
System.out.println(obj); // Person [name=张三, age=20]
3. Method m = cls.getDeclaredMethod("say"); //say是自己在类中自定义的方法
m.invoke(obj);//输出123456789,这个obj可以是new出来的或newInstance出来的
4. Object obj = Class.forName("Person").newInstance();
Field nameField = cls.getDeclaredField("name"); // 获得name属性
nameField.setAccessible(true); //解除封装
nameField.set(obj, "张三"); // Person对象.name = "张三"
System.out.println(nameField.get(obj)); // Person对象.name