反射

来源:互联网 发布:网络攻击 编辑:程序博客网 时间:2024/06/06 03:00

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()读写内容。

0 0