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
9/3日再学习
servlet MVC框架的老祖宗
反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。
packagecn.mldn.demo;
classPerson {}
publicclassTestDemo {
publicstaticvoidmain(String[] args) throwsException {
Person per = new Person() ; // 正着操作-由类到对象
System.out.println(per.getClass().getName()); // 反着来-由对象到类
}
}
以上的代码使用了一个getClass()方法,而后就可以得到对象所在的“包.类”名称,这就属于“反”了,但是在这个“反”的操作之中有一个getClass()就作为发起一切反射操作的开端。
Person的父类是Object类,而上面所使用getClass()方法就是Object类之中所定义的方法。
·取得Class对象:public final Class> getClass(),反射之中的所有泛型都定义为?,返回值都是Object。
而这个getClass()方法返回的对象是Class类的对象,所以这个Class就是所有反射操作的源头。但是在讲解其真正使用之前还有一个需要先解释的问题,既然Class是所有反射操作的源头,那么这个类肯定是最为重要的,而如果要想取得这个类的实例化对象,Java中定义了三种方式:
方式一:通过Object类的getClass()方法取得,基本不用:
packagecn.mldn.demo;
classPerson {}
publicclassTestDemo {
publicstaticvoidmain(String[] args) throwsException {
Person per = newPerson() ; // 正着操作
Class> cls = per.getClass() ; // 取得Class对象
System.out.println(cls.getName()); // 反着来
}
}
方式二:使用“类.class”取得,在日后学习Hibernate开发的时候使用
packagecn.mldn.demo;
classPerson {}
publicclassTestDemo {
publicstaticvoidmain(String[] args) throwsException {
Class> cls = Person.class; //取得Class对象
System.out.println(cls.getName()); // 反着来
}
}
方式三:使用Class类内部定义的一个static方法,主要使用
·取得Class类对象:public static Class> forName(String className) throws ClassNotFoundException;
packagecn.mldn.demo;
classPerson {}
publicclassTestDemo {
publicstaticvoidmain(String[] args) throwsException {
Class> cls = Class.forName("cn.mldn.demo.Person") ; // 取得Class对象