Java中的反射

类加载基础知识:



类只初始化一次。

类加载器:


反射:


通过Class来使用Teacher和student类的内容。

获取Class对象的方式(三种):

为什么要学反射,什么是反射?

反射就是不写出要想要创建的对象的类,但是依旧可以创建出该类的对象的魔法!

在框架中,我们无论写什么类,都可以被框架使用,就是利用了反射。

a.txt存储了我们书写的类的位置。
然后字符缓冲流读入这个文件。
然后就可以通过反射搞到这个对象。

三种方式获得Class对象:


这种灵活性最高,可以使用配置文件来完成配置。

获得Aniki类的公共构造函数数组和单个构造函数并且创建对象:

构造函数数组:


这是我们的Aniki类:

举例:

换成Constructor<?>[] declaredConstructors = Aniki_Class.getDeclaredConstructors();可以拿到全部。

创建无参对象:


我们获得的是public的无参构造函数,并且该对象名为constructor。constructor.newInstance()方法相当于使用
Aniki的无参构造方法,创造了一个Aniki类的aniki对象。

创建public有参对象:


创建private有参对象:


要使用暴力反射setAccessible(true)取消访问检查。

反射获取成员变量并使用:


打印结果啥都没有,因为咱们全都是private类型的成员变量。

换成getDeclaredFields()就有了。

给private成员赋值,如果是public则使用getField()方法并且无需setAccessible(true);

反射获取成员方法并使用:

方法数组参照之前的例子
Method[] methods = Aniki_Class.getMethods();//所有的public方法包括从父类继承的
Method[] declaredMethods = Aniki_Class.getDeclaredMethods();//所有public和private但是不包括父类的。
让private成员函数执行,如果是public则使用getMethod()方法并且无需setAccessible(true);

在ArrayList中添加字符串:


我们可以看到getMethod方法的参数是Object类型的。
结果:

反射可以越过泛型检查,获取它原始方法所需要的参数类型。

反射结合Properties配置文件:


略有尴尬,暂时无法表示配置文件的参数,所以我们含参的Method的参数
String.class, Integer.class, int.class还是要写在外面。
配置文件:

结果:

posted @ 2019-11-30 23:30  卯毛  阅读(142)  评论(0编辑  收藏  举报