首页 > 编程语言 >Java 反射

Java 反射

时间:2023-03-27 14:45:14浏览次数:39  
标签:反射 Java 对象 虚拟机 实例 Class

我在很久之前写过一次,也都是从网上搬运的知识,这段时间一直在学python,其他的知识就会有遗忘,我再复习一遍。

 

一. 反射的基本概念

使用反射机制可以构造类对象,动态获取当前class的信息 比如方法的信息、注解信息、方法的参数、属性等;

 

二. 实现反射相关的类库

java.lang.reflect

Construct Field Method 分别获取类的构造方法 成员变量 方法信息

 

三. 反射技术应用的场景

1.JDBC加载驱动连接 class.forname 时运用到了反射技术

2.Spring框架I用反射来实例化对象

3.自定义注解生效(反射+AOP)

4.第三方核心的框架

5.动态代理的场景中,使用到你跟他生成的代理类来提升代码的复用性

 


 

四. 反射的优点

增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作

提高代码的复用率,比如动态代理,就是用到了反射来实现

可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射动态调用

 


 

五. 反射的缺点

反射会涉及到动态类型的解析,所以JVM无法对这些代码进行优化,导致性能要比非反射调用更低。

使用反射以后代码的可读性会下降

放射可以绕过一些限制访问的属性或者方法,可能会导致破坏了代码本身的抽象性。

 

六. 程序运行过程的对比

Java程序的运行过程:

Person.java -> 编译器 -> Persion.class -> Java虚拟机 ->运行程序

Person = new Person()

虚拟机在执行的时候已经确切知道要实例化哪个类的对象

 

使用Java反射后程序运行的过程:

Java反射? -> 编译器 <=> 运行程序

虚拟机在实例化对象的时候,可以事先不知道要实例化哪个类的对象,传参的时候虚拟机根据参数确定要实例化哪个类的对象;根据参数不同,虚拟机可以实例化任意类型对象。

Class clz = Class.forName("persionPackage.Persion");

Object obj = clz.newInstance();

执行Class.forName的时候,类加载器会根据参数persionPackage.Persion去找这个类,把这个类加载到Java虚拟机,同时获取这个类的Class对象,每个类都有Class类型的对象,

这个对象保存了对应对象的元信息(属性,方法,构造函数)接下来再调用newInstance方法来实例化对象

 



 

标签:反射,Java,对象,虚拟机,实例,Class
From: https://www.cnblogs.com/baxianhua/p/17260741.html

相关文章

  • Java面试题(二)
    JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,java运行环境,为java的运行提供......
  • Java数据结构 HashMap 哈希表定义使用
    1.HashMapHashMap是一个散列表,它存储的内容是键值(key-value)映射。其中key和value类型可以相同也就而已不同,根据定义。2.HashMap使用1)定义HashMap<Integer,String>hashmap1......
  • java 类的初始化顺序
    父类的静态字段-->父类静态代码块-->子类静态字段-->子类的静态代码块-->父类成员变量-->父类构造代码块-->父类构造方法-->子类成员变量-->子类构造代码块-->子类构造方法......
  • Java程序基础
    一。面向对象的概念1.面向对象是一种思想,是Java基础知识中最重要的部分,没有之一。 面向对象是相对面向过程而言的,面向对象和面向过程都是一种思想。(1)分析不同面向......
  • java代码备份mysql数据库
    生成环境的数据库我们需要不断的进行备份,不然服务器出现故障,会是灾难性的直接添加我的代码packagecom.hrp.task;importcom.alibaba.fastjson.JSON;importcom.bas......
  • 剑指offer04(Java)二维数组中的查找(中等)
    题目:在一个n*m的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一......
  • Java静态代理和动态代理的区别
    一、静态代理代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。优点:可以在......
  • 【JavaScript快速排序算法】不同版本原理分析
    说明快速排序(QuickSort),又称分区交换排序(partition-exchangesort),简称快排。快排是一种通过基准划分区块,再不断交换左右项的排序方式,其采用了分治法,减少了交换的次数。它的......
  • 某大厂面试题:说一说Java、Spring、Dubbo三者SPI机制的原理和区别
    大家好,我是三友~~今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是......
  • Java 在代码中区分json和array
    publicstaticvoidmain(String[]args){Stringn="{\n"+""data":[\n"+"{\n"+""category":"设计资质",\n"+""certNameL......