java反射机制原理详解.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
java.lang.Class:是反射的源头 我们创建一个类,通过编译,生成对应的.calss文件,之后使用java.exe加载(jvm的类加载器)此.class文件,此.class文件加载到内存以后,就是一个运行时类,存在缓存区,那么这个运行时类的本身就是一个class的实例 每一个运行时类只加载一次 有了Class实例以后,我们才可以进行如下的操作: o创建对应的运行时类的对象(重点) o可以获取对象的运行时类的完整结构(属性、方法、构造器、内部类、、、)(理解) o调用对应的运行时类的指定的结构(属性、方法)(重点) 在反射以前,如何创建一个类的对象,并调用其中的方法属性 Java反射机制是Java语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息以及对类的对象进行操作。在Java中,一切皆为对象,类也不例外。`java.lang.Class`类是反射的起点,它代表了Java运行时的类信息。当我们编写一个Java类并编译后,会生成对应的`.class`文件。Java虚拟机(JVM)的类加载器会加载这些`.class`文件到内存中,形成运行时类,每个运行时类只加载一次。一旦拥有`Class`的实例,我们就可以进行一系列的操作。 **一、反射概述** 1. `java.lang.Class`: 作为反射的源头,`Class`对象代表了在运行时的类信息。通过`Class`对象,我们可以获取到类的属性、方法、构造器等详细信息,并且可以动态地创建类的对象及调用其方法。 **二、如何获取`Class`的实例** 1. 调用运行时类本身的`.class`属性:例如`Class clazz = Person.class;` 2. 通过运行时类的对象获取:`Class clazz2 = p.getClass();`,其中`p`是`Person`类的一个实例。 3. 通过`Class`的静态方法`forName(String className)`:例如`Class clazz4 = Class.forName(className);` 4. 通过类的加载器获取:更复杂的情况,一般用于自定义类加载。 **三、创建运行时类对象** 1. 获取`Class`的实例后,可以通过`newInstance()`方法创建类的对象,这要求该类有无参构造器。 2. 如果类没有公开的无参构造器,可以通过`getDeclaredConstructor()`获取私有的构造器,并设置`accessible(true)`来访问,然后调用`newInstance()`。 **四、通过反射获取类的完整结构** 1. 获取运行时类的属性:`Field[] fields = clazz.getFields();`和`Field[] declaredFields = clazz.getDeclaredFields();` 2. 获取属性的各个部分:如访问权限、类型等。 3. 获取运行时类的方法:`Method[] methods = clazz.getMethods();`和`Method[] declaredMethods = clazz.getDeclaredMethods();` 4. 获取方法的各个部分:参数类型、返回类型、修饰符等。 5. 获取构造器:`Constructor<?>[] constructors = clazz.getConstructors();`和`Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();` 6. 获取运行时类的父类:`Class<?> superClazz = clazz.getSuperclass();` 7. 获取带泛型的父类:通过方法或字段获取,因为泛型在运行时被擦除,所以只能通过方法签名或字段类型获取。 8. 获取父类的泛型:通过方法的`getGenericReturnType()`和`getGenericParameterTypes()`,或者字段的`getGenericType()`。 9. 获取实现的接口:`Class<?>[] interfaces = clazz.getInterfaces();` 10. 获取所在的包:`Package pkg = clazz.getPackage();` **五、调用运行时类的指定结构** 1. 调用运行时类指定的属性并赋值:通过`Field`对象的`set(Object obj, value)`方法。 2. 调用运行时类中指定的方法:`Method`对象的`invoke(Object obj, args[])`方法。 3. 调用指定的构造器创建类对象:`Constructor`对象的`newInstance(args[])`方法。 **六、ClassLoader** 1. JVM加载类文件的原理机制:类加载器首先检查类是否已被加载,如果没有,则通过类名找到对应的`.class`文件,读取字节码,转换为运行时数据结构,然后由类加载器实例化。 在实际开发中,反射机制常用于插件框架、动态代理、序列化、对象克隆、动态加载类等功能。然而,由于反射会破坏封装性,增加程序的复杂性和运行时性能开销,因此在使用时需要谨慎。
剩余26页未读,继续阅读
- 粉丝: 251
- 资源: 1940
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助