类加载基础知识:
类只初始化一次。
类加载器:
反射:
通过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还是要写在外面。
配置文件:
结果: