类加载器和反射机制

加载->连接->初始化

每一个类都是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方法,接下来我都不好意说了!对就是你想的那样!

猜你喜欢

转载自blog.csdn.net/u012232736/article/details/80259937