加载->连接->初始化
每一个类都是Class类的一个对实例对象
类加载器:
Bootstrap ClassLoader: 根类加载器
加载核心类库
Extension ClassLoader:扩展类加载器
加载JRE的扩展目录(%JAVA_HOME%/jre/lib/ext等)
System ClassLoader:系统类加载器
加载来自java命令的-classpath选项、java.class.path系统属性等
类加载缓冲区,如果缓冲区有此类的class,则返回java.lang.Class 对象 没有则加载该类到缓冲区
ClassLoader 类加载器是所有加载器的父类出根类加载器;
自定义加载器主要extends ClassLoader override findClass(String name) 方法;
类A、类B 都是 Class 类的对象
反射:通过邪恶手段破获一个类的属性、方法、构造器;
怎么做?
1.先获得该类的Class对象
2.通过Class对象获得 构造器、方法、属性(public,protected,private都可获得)
怎么获得Class对象呢?
//知道类名
(1)Class类的静态方法 forName(String classname);注意理解其中的层次感,classname 为该类的全限定类名(你懂的)
//有类A,即程序中以及import 或者定义了此类
(2)每个类都有class这个属性,这个属性是Class类型的,保存了该类的Class对象。类A.class 属性(^_^) 就是 类A的 Class对象
//有对象
(3)对象的getClass() 方法 将返回该对象所对应的类的 Class 对象。
得到了Class如何获得构造器、方法、属性?
(1)getConstructor(...)、getConstructors(...);getDeclaredConstructors(..)。。。 四种 返回Constructor 对象
(2)getMethod, getDeclaredMethods。。。同上四种 返回Method对象
(3)getField getDeclaredFields 。。。同上四种 返回Field 对象
(4)get 注解 内部类等等
通过getxxx方法可以获得该类中的所有内容;(有没有中被扒光衣服的感觉?so 不安全?)
既然扒光了该类那么如何操作该类呢?
第一步当然是创建该类对象
(1)Class类对象的newInstance() 方法 ,该方法默认使用类A的 默认构造器;
(2)获取指定的Constructor对象,在调用Constructor对象的newInstance
如何调用该类的方法呢?
Method对象有invoke 方法,so当然是调用invoke方法来调用反射获得的方法啦!
如何控制(get,set)属性?
Field对象有getxxx ,setxxx方法,接下来我都不好意说了!对就是你想的那样!