商城类网站建设需要多少钱,电子商务公司怎么运营,商业网站开发与设计,怎么做网页自我介绍什么是反射
反射是一种让Java拥有一定动态性的机制#xff0c;它允许程序在执行期间取得任何类的内部信息#xff0c;并且直接操作任意对象的内部属性及方法
类加载
类加载后通过堆内存方法区的Class类型对象就能了解该类的结构信息#xff0c;这个对象就像该类的一面镜子…什么是反射
反射是一种让Java拥有一定动态性的机制它允许程序在执行期间取得任何类的内部信息并且直接操作任意对象的内部属性及方法
类加载
类加载后通过堆内存方法区的Class类型对象就能了解该类的结构信息这个对象就像该类的一面镜子通过这面镜子能够看到类的所有结构无论是不是private的所以称之为反射
某类需要被使用时如果还未加载系统会通过类的加载、类的连接和类的初始化三步来准备类统称为类加载或类初始化
1. 加载将class文件读入内存创建一个java.lang.Class对象任何类被使用时都会有 2. 连接验证内部结构为类变量分配内存并赋默认值将二进制数据的符号引用转为直接引用 3. 初始化对类变量初始化从祖宗类开始如果类有初始化语句就依次执行
反射能做什么
在运行时
判断对象的类构造任一类的对象判断任一类的成员变量和方法获取泛型信息调用任一对象的成员变量和方法处理注解动态代理
它可以动态创建对象和编译但是反射实时给JVM需求会比直接操作慢
反射获取Class对象
用Class.forName()方法通过反射直接获取test包下Dog类的Class对象
Class cls Class.forName(test.Dog);用object.getClass()方法通过反射借助Dog类实例获取Dog类的Class对象
Class cls2 (new Dog()).getClass();用类名.class int[ ]也算
Class cls3 Dog.class;通过反射获得类的结构
调用缺省构造函数返回Class对象的一个实例
Object istc cls.newInstance();获得该Class对象的实体类接口数组类void名称
String name cls.getName();获得父类Class对象
Class? clsParent cls.getSuperClass();获得接口Class对象的数组
Class?[] Its cls.getInterfaces();获得该类的类加载器
ClassLoader cld cls.getClassLoader();获得该类Constructor对象的数组
Constructor[] constructors cls.getConstructors();获得一个Method对象此对象形参为paramType
Method m cls.getMethod(.......)获得所有的Field属性/方法/构造器数组
Field[] fields cls.getDeclaredFields();
Method[] methods cls.getDeclaredMethods();
Constructor[] constructors cls.getDeclaredConstructors();获取public的属性/方法/构造器
Field[] fields cls.getFields();
Method[] methods cls.getMethods();
Constructor[] constructors cls.getConstructors();获取指定属性/方法/构造器
Field cls.getField(name);
Method method1 cls.getMethod(getName, null);
Method method2 cls.getMethod(setName, String.class);
Constructor constructor cls.getConstructor(String.class, int.class);//参数类型类加载器了解
负责将.class文件加载入内存并生成对应java.lang.Class对象 加载器机制
全盘负责加载某个类时其关联的其他Class也由同一加载器加载父类委托先让父类加载器加载如果无法加载才自己加载缓存机制缓存被加载过的Class先找缓存找不到再加载类二进制数据转换成Class对象并缓存
加载器类型
Bootstrap根类加载器jvm内置加载器不属于ClassLoader谱系底层是C对开发者透明Plantform class loader平台类加载器负责Java SE API的实现类和JDK特定运行时类System class loader应用程序类加载器如果没有特别指定则用户自定义的类加载器都以此类加载器作为父加载器。
类加载器流程
检测此Class是否载入过即在缓冲区中是否有此Class如果有直接进入第8步否则进入第2步。如果没有父类加载器则要么Parent是根类加载器要么本身就是根类加载器则跳到第4步如果父类加载器存在则进入第3步。请求使用父类加载器去载入目标类如果载入成功则跳至第8步否则接着执行第5步。请求使用根类加载器去载入目标类如果载入成功则跳至第8步否则跳至第7步。当前类加载器尝试寻找Class文件如果找到则执行第6步如果找不到则执行第7步。从文件中载入Class成功后跳至第8步。抛出ClassNotFountException异常。返回对应的java.lang.Class对象。
获取泛型
获取注解
看文档