8:反射:
"反":即可以通过对象取得对象的出处。因Object类对象可以通过getClass()取得class。
实例化对象有三种方式:new,clone,反射
在Java中,类是Class<T>类的一个对象:
java.lang.Class<T>:是反射的源头,全部的反射均从此开始。
Class类对象的实例化有三种办法:
1: obj.getClass()
2:通过 类名.class Sprint,hibernate等这样实现
Class<?>cls = Data.class;
3:通过java.lang.Class<T>的 forName(String className)
Class<?>cls = Class.forName("java.util.Date");
System.out.println(cls);
因为类名称使用字符串,可以不用import导入类。该函数不但可以获取Class类对象,也将对应的类加载了。而后完成(加载,链接(验证,准备,解析),初始化)。
在链接的解析阶段,又将该类引用的类,接口,父类等又做加载。
反射构造:
有了class的对象以后,就可以通过newInstance()创建具体的对象(创建class类对象表示的类的对象)。
Class<?>cls = Class.forName("java.util.Date");
Objectobj = cls.newInstance();//相当于无参实例化,无参构造
Datedt = (Date)obj;
这样做主要为了解耦合。
对于构造函数需参数的类,就必须明确调用有参构造:
Class.getConstructor(); //返回一个Constrator类的对象。
public Constructor<T> getConstructor(Class<?>... parameterTypes)
再通过这个Constractor对象调用newInstance(参数...)构造对象。
因此为做类厂等统一调用,最好简单类都提供无参构造函数。
调用普通函数,成员:
public Method getMethod(String name, Class<?>... parameterTypes)
返回一个Method对象,再通过它的invoke调用。
public Field getField(String name)
返回一个Field对象,通过set(),get()读写内容。