深入理解java的反射机制(转载) Love The Way You Lie 2022-05-04 15:28 229阅读 0赞 **原文路径:[http://blog.51cto.com/4247649/2109128][http_blog.51cto.com_4247649_2109128]** **今天将从以下4方面来系统的学习一下java的反射机制:** * **java反射是什么** * **java反射(Reflection)底层实现原理** * **java反射的简单演示** * **java反射的应用场景** **1,java反射是什么** 首先大家应该先了解两个概念,**编译期**和**运行期**,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;**这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制** **2,java反射(Reflection)的底层实现原理** 众所周知Java有个**Object 类**,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个**Class 对象** 而这个Class 类十分特殊。它和一般类一样继承自Object,当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。 而Class对象是java反射故事起源。Class类提供了大量的实例方法来获取该Class对象所对应的详细信息,我们只是做简单的介绍,详细请参考JDK文档,这边提供一个在线的中文文档给大家如下: > http://tool.oschina.net/apidocs/apidoc?api=jdk-zh 这边列了下Class类其中的很少yibufen方法, > 获取公共构造器 getConstructors() > 获取所有构造器 getDeclaredConstructors > 获取包含的方法 getMethod() > 获取包含的属性 getField(String name) > 获取内部类 getDeclaredClasses() > 获取外部类 getDeclaringClass() > 获取所实现的接口 getInterfaces() > 获取修饰符 getModifiers() > 获取所在包 getPackage() > 获取类名包含包路径 getName() > 类名不包含包路径 getSimpleName() **3,java反射的简单演示** 上面介绍了下java反射的实现机制,接下来我主要来演示一下反射的使用 首先定义一个user对象类如下: /** * 定义一个用户对象 * * @author zhangqh * @date 2018年4月24日 */ public class User implements Serializable { /** * */ private static final long serialVersionUID = 1L; /** * 用户id */ private Integer userId; /** * 用户名称 */ private String userName; /** * 公共元素 */ public String age; private User(Integer userId){} public User(){} public User(Integer userId, String userName) { super(); this.userId = userId; this.userName = userName; } /** * @return the userId */ public Integer getUserId() { return userId; } /** * @param userId the userId to set */ public void setUserId(Integer userId) { this.userId = userId; } /** * @return the userName */ public String getUserName() { return userName; } /** * @param userName the userName to set */ public void setUserName(String userName) { this.userName = userName; } } 测试反射类: /** * 测试反射类 * * @author zhangqh * @date 2018年4月25日 */ public class Test { public static void main(String[] args) throws ClassNotFoundException { // 第一种方法 直接通过类名获取class (一般不会这么用,因为实例都获取到了没必要多此一举) User user = new User(); Class class1 = user.getClass(); System.out.println("我是方法1反射处理的类 = "+class1); System.out.println("我是方法1反射处理的类的父类 = "+class1.getSuperclass()); System.out.println("----------------------------------------------------"); // 第二种办法通过类名的方法获取class 需要增加对应的类引用 Class class2 = User.class; System.out.println("我是方法2反射处理的类 = "+class2); System.out.println("我是方法2反射处理的类的父类 = "+class2.getSuperclass()); System.out.println("----------------------------------------------------"); // 第三种办法通过全类名获取,用的比较多,也推荐使用这种方式 Class class3 = Class.forName ("com.zhang.reflection.User"); System.out.println("我是方法3反射处理的类 = "+class3); System.out.println("我是方法3反射处理的类的父类 = "+class3.getSuperclass()); System.out.println("----------------------------------------------------"); // 反射获取User对象的公共构造器 Constructor<User>[] constructors = class3.getConstructors(); for(int i=0;i<constructors.length;i++){ System.out.println("我是公共构造器"+(i+1)+" = "+constructors[i]); } System.out.println("----------------------------------------------------"); //反射获取User对象的所有构造器 Constructor<User>[] dconstructors = class3.getDeclaredConstructors(); for(int i=0;i<dconstructors.length;i++){ System.out.println("我是所有构造器"+(i+1)+" = "+dconstructors[i]); } System.out.println("----------------------------------------------------"); // 反射获取User对象的 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法 Method[] methods = class3.getMethods(); for(int i=0;i<methods.length;i++){ System.out.println("我是公共方法"+(i+1)+" = "+methods[i]); } System.out.println("----------------------------------------------------"); // 反射获取User对象的 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法 Method[] dmethods = class3.getDeclaredMethods(); for(int i=0;i<dmethods.length;i++){ System.out.println("我是所有的方法"+(i+1)+" = "+dmethods[i]); } System.out.println("----------------------------------------------------"); // 获取包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段 Field[] fields = class3.getFields(); for(int i=0;i<fields.length;i++){ System.out.println("我是公共的field"+(i+1)+" = "+fields[i]); } System.out.println("----------------------------------------------------"); Field[] dfields = class3.getDeclaredFields(); for(int i=0;i<dfields.length;i++){ System.out.println("我是所有的field"+(i+1)+" = "+dfields[i]); } System.out.println("----------------------------------------------------"); String sname = class3.getSimpleName(); System.out.println("我是类名不包含包路径 = "+sname); System.out.println("----------------------------------------------------"); String name = class3.getName(); System.out.println("我是类名包含包路径 = "+name); System.out.println("----------------------------------------------------"); Package packA=class3.getPackage(); System.out.println("我是类的包路径 = "+packA.getName()); System.out.println("----------------------------------------------------"); Class<?>[] interfaces=class3.getInterfaces(); for(int i=0;i<interfaces.length;i++){ System.out.println("我是实现的接口"+(i+1)+" = "+interfaces[i]); } System.out.println("----------------------------------------------------"); // 返回此类或接口以整数编码的 Java 语言修饰符。修饰符由 Java 虚拟机的 public、 protected、 private、 final、 static、 abstract 和 interface 对应的常量组成; // 它们应当使用 Modifier 类的方法来解码 Integer modefiers = class3.getModifiers(); System.out.println("我是类的modefiers = "+modefiers); } } 以上代码中有详细的代码注释,这边就不过多的解释了 **4,java反射的应用场景** **a,注解的使用** 不知道大家是否有看过之前写的[深入理解java注解的实现原理][java]它的底层实现就是java反射,主要有如下方法: > getAnnotations() > getAnnotation(Class annotationClass) > getDeclaredAnnotations() > isAnnotation() > isAnnotationPresent(Class annotationClass) **b,编写基础框架** 有一句话这么说来着:**反射机制是很多Java框架的基石**,经典的就是在xml文件或者properties里面写好了配置,然后在Java类里面解析xml或properties里面的内容,得到一个字符串,然后用反射机制,根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,spring,Hibernate底层都有类似的实现 **c,其他在编码阶段不知道那个类名,要在运行期从配置文件读取类名配置** 如下:这段代码想必大家肯定都有写过,这个数据库的连接驱动类就是编译的时候不知道你到底是用的mysql,oracle还是其他数据库,而是由运行期动态加载的 // 1.加载驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 2.获得数据库的连接 Connection conn = DriverManager.getConnection(URL, NAME, PASSWORD); // 3.通过数据库的连接操作数据库,实现增删改查 Statement stmt = conn.createStatement(); ResultSet rs = stmt .executeQuery("select user_name,age from user"); while (rs.next()) {// 如果对象中有数据,就会循环打印出来 System.out.println(rs.getString("user_name") + "," + rs.getInt("age")); } 注:以上介绍了反射的应用场景,程序猿开发业务代码中应尽量少用反射,一个是代码**可读性不是特别好**,第二是反射需要运行期jvm去重新解析性能上也没有直接使用好,唯一比较合理的地方是业务中需要**用到AOP**可以大大简化业务代码建议使用 以上是今天文章的所有内容,欢迎大家吐槽![smiley_29.png_wx_lazy_1][] [http_blog.51cto.com_4247649_2109128]: http://blog.51cto.com/4247649/2109128 [java]: http://mp.weixin.qq.com/s?__biz=MzAxMjY1NTIxNA==&mid=2454441897&idx=1&sn=729688d470c94560c1e73e79f0c13adc&chksm=8c11e0a8bb6669be1cc4daee95b221ba437d536d598520d635fac4f18612dded58d6fddb0dce&scene=21#wechat_redirect [smiley_29.png_wx_lazy_1]: /images/20220504/76061db01c8a49f5a6373c6692ce6124.png
相关 Java反射机制的深入理解和应用案例 Java反射机制是一种强大的工具,它允许我们在运行时检查对象的信息,如类名、方法名、属性等。以下是对反射机制的理解和应用案例: 1. 理解: - 类加载:Java通过C ﹏ヽ暗。殇╰゛Y/ 2024年09月18日 12:36/ 0 赞/ 4 阅读
相关 Java反射机制深入理解与实战 Java反射机制是Java语言提供的一种能力,允许程序在运行时检查类、接口、方法、字段等任何信息,并动态地调用这些方法或访问这些字段。 理解和掌握反射机制主要有以下几个方面: 亦凉/ 2024年09月14日 22:30/ 0 赞/ 12 阅读
相关 Java反射机制的深入理解和应用 Java反射机制是Java语言提供的一种能力,可以让我们在运行时检查类、字段和方法等对象的信息,并动态调用它们。 深入理解: 1. 类加载:Java通过类加载器(Class 落日映苍穹つ/ 2024年09月13日 03:15/ 0 赞/ 20 阅读
相关 Java反射机制的深入理解及常见问题 Java反射机制是Java语言提供的一种动态获取和操作对象信息的能力。它使得在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;甚至还可以对类进行任意的动态调用。 以你之姓@/ 2024年09月11日 04:09/ 0 赞/ 22 阅读
相关 深入理解Java中的反射机制 Java的反射机制是一种在运行时检查类、接口、方法、构造器等对象信息并动态调用它们的方法的能力。 以下是对反射机制的一些深入理解: 1. 类和对象:反射可以获取任意一个类的 我会带着你远行/ 2024年09月04日 08:00/ 0 赞/ 25 阅读
相关 深入理解反射机制 Java代码在计算机中经历的三个阶段 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR 青旅半醒/ 2022年12月04日 02:27/ 0 赞/ 206 阅读
相关 深入理解java反射机制 (转自:[https://blog.csdn.net/u012585964/article/details/52011138][https_blog.csdn.net_u012 悠悠/ 2022年05月24日 10:08/ 0 赞/ 253 阅读
相关 深入理解java的反射机制(转载) 原文路径:[http://blog.51cto.com/4247649/2109128][http_blog.51cto.com_4247649_2109128] 今天将从以 Love The Way You Lie/ 2022年05月04日 15:28/ 0 赞/ 230 阅读
相关 深入Java反射机制 目录 1 Java反射机制 1.1 RTTI 1.2 Java反射机制是啥 1.2.1 类Class 1.2.2 Object类 1.2.3 利用Class类来创建 水深无声/ 2022年03月22日 11:09/ 0 赞/ 232 阅读
还没有评论,来说两句吧...