在类加载完成后,通过反射来拿取这个类的完整的结构信息
通过反射,可以完整地获取一个类,包括该类的内部的各种信息
java.lang.Class :这个对象就是代表了一个加载后的类,使用这个对象,获取一个你需要的类的信息
Class clazz = Xxx.class;
clazz.getConstructor getMethod getParamter等等
对java.lang.Class的理解:每一个运行时类,就是一个Class实例
不使用反射,无法使用类内部的一些私有方法
通过反射可以调用(setAccessible(true))
因此,使用反射可以修改类的结构,修改方法的修饰符等等,改变类
但是这并不代表封装就是没用的,反射确实可以打破封装,在编译层面,但这在约定俗成的编程逻辑上是有问题的,一个方法是private,那么一定就是不希望别人去调用该方法,而是应该去调用写好的暴露在外的接口
获取Class实例的方式
1.Xxx.class
2.object.getClass()
3.forName(String classPath)
在最后还验证了Class是单例模式的(很好理解,因为运行时类是唯一的)
方法四:使用类加载器,classLoader.loadClass(String className)
哪些类型会有Class对象
ClassLoader了解(具体在jvm中讲) 类加载器作用,和提供的类加载器类型
可以通过反射获取整个类的完整结构(但是实际开发不会这么无聊……)
调用运行时类的指定结构(重点)
getDeclaredField(String fieldName) 获取运行时类中指定的属性
然后就可以自己设置属性值
getDeclaredMethod(String MethodName,…args) 获取运行时类中指定的方法
后面的参数定义的是,该方法声明的形参列表(因为可能会有同名方法 Override和Overwrite)
获取到method之后,使用method.invoke执行该方法(重要,之后动态代理也是invoke去执行方法)
调用静态方法:invoke里面的参数1,有变化,从一个类对象,变成了类本身(Xxx.class)
获取运行时类指定的构造器,里面的参数是指明构造器的参数列表