反射 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 loader)的defineClass()被JVM调用时,JVM会自动生成一个Class对象。
Class 对象是 java 反射故事的起源。 Class类提供了大量的实例方法来获取Class对象对应的详细信息。 我们只是简单介绍一下。 有关详细信息反射 java,请参阅 JDK 文档。 这里为您提供在线中文文档如下:
下面是 Class 类的一些方法的列表,
3、java反射的简单演示
上面介绍了java反射的实现机制。 接下来我主要演示一下反射的使用。
首先定义一个用户对象类如下:
测试反射类:
上面代码中有详细的代码注释,这里不再过多解释
四、java反射的应用场景
a、注解的使用
其实我们经常用到java注解。 它的底层实现原理是java反射。 主要方法如下:
b、编写基本框架
有句话说:反射机制是很多Java框架的基石。 经典的是在xml文件或者properties中写配置,然后解析xml中的内容或者Java类中的properties得到一个字符串,然后根据反射机制获取某个类的Class实例到这个字符串,这样就可以动态配置一些东西。 Spring和Hibernate在底层有类似的实现
c、别人在编码阶段不知道类名,运行时必须从配置文件中读取类名配置
如下: 这段代码想必大家都写过。 编译了这个数据库的连接驱动类。 不知道你用的是mysql、oracle还是其他数据库反射 java,都是运行时动态加载的。
注:上面介绍了反射的应用场景。 程序员在开发业务代码时应尽量少用反射。 一是代码可读性不是特别好,二是reflection需要runtime jvm重新解析,从性能上来说并没有直接使用。 ,唯一合理的地方就是业务中需要使用AOP,可以大大简化业务代码。 建议使用
喜欢的朋友请点击关注!