Java反射由浅入深全面解析 待我称王封你为后i 2022-04-13 04:56 245阅读 0赞 分享一下学习反射的笔记,了解反射之前要先了解一下java的class类。 ### 1. Class类 ### * Java除了基本类型外其它都是`Class`类(包括了`interface`)。 String s = "Hello"; Runnable runnable = new Thread(); ....... * Class(包括`interface`)的本质是数据类型(Type); > 一个对象的实例,赋值给一个数据类型变量的时候,严格按照数据类型来赋值。 * 无继承关系的数据类型无法赋值。 * `class/interface`的数据类型是`Class`。 每加载一个`class`,`JVM`为其创建一个`Class`类型的实例,并关联起来。 public final class Class{ //Class实例是JVM内部创建的 pirvate Class () {} } `JVM`在加载`Stirng`类的时候,读取`String.class`文件,为`String`类创建一个`Class`实例,`Class class = new Class(Stirng);`。 `JVM`持有的每个`Class`实例都指向了一个数据类型(`class`或`interface`)。 ![Image 1][] 一个 `Class`实例包含了该 `class`的完整信息。 ![Image 1][] * `JVM`为每个加载的`class`创建对应的`Class`实例,并在实例中保存了该`class`的所有信息。 * 如果获取了某个`Class`实例,则可以获取到该实例对应的`class`的所有信息。 * 通过`CLass`实例获取`class`信息的方法称为反射(Refection)。 //获取一个class的Class实例 Class clas = String.class; String s = "hello"; Class cals = s.getClass(); Class class = Class.forName("java.lang.String"); * `Class`实例在`JVM`中是唯一的: 可以用==比较两个`Class`实例。 Class cla1 = String.class; String s = "hello"; Class cal2 = s.getClass(); Class cla3 = Class.forName("java.lang.String"); boolean b1 = cls1 ==cls2; // true boolean b1 = cls2 ==cls3; // true * `Class`实例比较和`instanceof`的差别; 用`instanceof`比较的时候,不但匹配当前类型,还匹配当前类型的子类。`==`只匹配当前类型。通常情况下用`instanceof`判断是数据类型,只有精确判断某个实例是否是某个类型的时候才用`==`来判断。 Integer n = new Integer(123); boolean b1 = n instanceof Integer ; // true boolean b2 = n instanceof Number; // true boolean b3 = n.getClass() == Integer.class;// true boolean b4 = n.getClass() == Number.class;// false * 反射的目的是获得某个`Object`实例时,我们可以获取该`Object`的`class`信息。 * 从`Class`实例判断`class`类型。 Runnable.class.isInterface(); //true String[].class.isArray(); //true * 利用`JVM`动态加载`class`的特性可以在运行其根据条件加载不同的实现类。 //commons Logging优先使用Log4j LogFactFactory factory; if (isClassPresent("org.apache.logging.log4j.Logger")) { factory = createLog4j(); } else { factory = createJdkLog(); } boolean isClassPresent(String name) { try { Class.forName(name); return true; } cath (Exception e) { return false; } } ### 2. 访问字段(field) ### * 通过`Class`实例获取`field`信息: getField(name):获取某个public的field(包括父类)。 getDeclaredField(name):获取当前的某个类的field(不包括父类)。 gerFields:获取所有public的field(包括父类)。 getDeclaredFileds():获取当前类的所有filed(不包括父类)。 * Filed对象包含一个field的所有信息: `getName(); getType(); getModifiers()`; * 获取一个filed值:`get(Object)`获取一个实例的该字段的值。 * 设置一个filed值:`set(Object)`设置一个实例的该字段的值。 * 通过`setAccessible(true)`来访问非public字段。 **注意:**设置setAccessible(true)的时候可以访问private字段 。但是这个方法可能会失败。如果定义了SecurityManManager,它的规则阻止了对该field设置Accessible就会抛出异常 。例如:把规则应用于所有的java和javax开头的package的类,那么对于java的核心类就不能访问它们的private字段。通常情况下自己写的类和第三方的类是没有这个限制的。 ### 3. 调用方法(method) ### * 通Clsss实例获取methood信息: getMethod(...):获取某个public的method(包括父类)。 getDeclaredMethod(...):获取当前类的某个method(不包括父类)。 getMethods():获取所有public的method(包括父类)。 getDeclaredMethods():获取当前类的所有method (不包括父类)。 * Method对象包含一个method的所有信息: getName():返回一个名称。 getReturnType():返回一个类型。 getParParameterTypesTypes():返回一个参数类型。 getModifiers():返回方法的修饰符。 * 调用无参数的Method Object invoke(Object obj) Integer n = new Integer(123); Class cls = n.getClass(); Method m = cls.getMethod("toString"); String s = (String) m. invoke(n); //"123",相当于String s = n.toString(); * 调用有参数Method Object invoke(Object obj,Object...args) Integer n = new Integer(123); Class cls = n.getClass(); Method m = cls.getMethod("compareTo",Intefer.class); int i = (Integer ) m. invoke(n,456);//相当于int i = n.toCompareTo(456); ### 4. 获取继承关系 ### * 获取父类的Class: Class getSuperclass() Object的父类是null interface的父类是null Class sup = Integer.class.getSuperclass();// Number.class * getInterface(); * 通过Class对象的isAssignableFrom()方法可以判断一个向上转型是否正确。 [Image 1]:
相关 Java反射机制实例解析 Java反射机制是Java语言提供的一种能力,允许程序在运行时检查类的信息(如方法、属性等)并动态调用这些信息。 下面是一个简单的实例解析: ```java // 创建一个 我就是我/ 2024年09月16日 21:51/ 0 赞/ 14 阅读
相关 Java反射机制深入解析 Java的反射机制是一种强大的工具,它允许我们在运行时检查类、方法和字段的信息。以下是反射机制深入解析的关键点: 1. 类加载:当Java应用需要访问一个类时,Java虚拟机 亦凉/ 2024年09月15日 05:03/ 0 赞/ 7 阅读
相关 Java反射机制深入解析 Java的反射机制是一种强大的工具,它允许程序在运行时检查和修改类、对象及方法的信息。下面对Java反射机制进行深入解析: 1. **Class**:这是反射的主要对象类型, 忘是亡心i/ 2024年09月11日 19:57/ 0 赞/ 44 阅读
相关 由浅入深Netty协议设计与解析 目录 1 为什么需要协议? 2 redis 协议举例 3 http 协议举例 4 自定义协议要素 4.1 编解码器 4. 淡淡的烟草味﹌/ 2024年03月22日 19:45/ 0 赞/ 43 阅读
相关 Java反射源码解析 > Java反射机制带给Java无限的想象空间,那么Java反射的底层是如何实现的? > https://www.cnblogs.com/yougewe/p/10125073 - 日理万妓/ 2022年12月11日 12:24/ 0 赞/ 159 阅读
相关 redis全面解析 什么是Redis? Redis 是开源免费的,遵守BSD协议,是一个高性能的key-value非关系型数据库。 redis单线程问题 所谓的单线程指的是网络 ゝ一纸荒年。/ 2022年05月14日 07:46/ 0 赞/ 257 阅读
相关 Java反射机制解析 首先在反射之前我们要先了解java类的整个加载机制:我们的.java源码文件通过编译之后会生成一个JVM可识别的二进制字节码.class文件,每一个类都会产生一个Class对象 - 日理万妓/ 2022年04月23日 12:36/ 0 赞/ 230 阅读
相关 Java反射由浅入深全面解析 分享一下学习反射的笔记,了解反射之前要先了解一下java的class类。 1. Class类 Java除了基本类型外其它都是`Class`类(包括了`interf 待我称王封你为后i/ 2022年04月13日 04:56/ 0 赞/ 246 阅读
相关 java反射机制详细解析 (一)什么是反射机制? 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动 喜欢ヅ旅行/ 2021年09月15日 02:32/ 0 赞/ 325 阅读
还没有评论,来说两句吧...