反射

  • 一、什么是反射
  • 二、反射的特点
    • 1.优点:主要是其动态性
    • 2.缺点:主要是性能损失
  • 三、实现Java反射机制的类都位于java.lang.reflect包中:
  • 四、使用场景
  • 5.替代方案
  • 六、案例

声明:Java中编译类型有两种

  • 静态编译:在编译时确定类型,绑定对象即通过
  • 动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。

一、什么是反射

Java反射是Java被视为动态(或准动态)语言的一个关键性性质。这个机制允许程序在运行时透过Refiection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public、static等)、superclass(例如Object)、实现之interfaces(例如Cloeable),也包括fields和method的所有信息,并可于运行时改变fields内容或唤起methods。
Refiection可以在运行时加载、探知、适应编译期间完全未知的classes。即Java程序可以加载一个运行时才得知名称的class,获取其完成构造,并生成其对象实体、或对其fields设值、或唤起methods。
反射(reflection)运行静态语言在运行时(runtime)检查、修改程序的结构与行为。
在静态语言汇总,使用一个变量时,必须知道它的类型。在Java中,变量的类型信息在编译时都保存到了class文件中,这样在运行时才能保证准确无误;换句话说,程序在运行时的行为都是固定的。如果想在运行时改变,就需要反射这东西了。

二、反射的特点

1.优点:主要是其动态性

  • 1.反射和new 都能创建用户对象,并且调用里面的方法,但是反射是针对字符串编程,new是针对实体类编程
  • 2.可以使框架更灵活
  • 3.可以深入到类的内部结构,去做一些操作。

2.缺点:主要是性能损失

三、实现Java反射机制的类都位于java.lang.reflect包中:

1、Class类:代表一个类
2、Field类:代表类的方法
3、Method:代表类的方法
4、Constructor类:代表类的构造方法
5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法

四、使用场景

反射主要在构件框架时用的多
举例:

1.根据配置文件来动态生成相对的类型对象
2.根据注解来动态确定程序执行逻辑,如retrofit
3.生成动态代理
4.突破一些sdk的API接口限制(访问一个类的私有字段,私有方法等)

5.替代方案

反射主要运用在构件框架上,平常项目中运用不到

  • 使用注解进行标记
  • 用过注解处理器(API)编译时帮我们生成相关代码
    特点:①:没用运行时性能损失,因为性能损失在编译器了;②:还保留了类型信息

六、案例

//案例一
package reflect;import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class ReflectTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//获取类的Class对象实例Class person = Class.forName("reflect.Person");//根据Class对象实例获取Constructor对象//Constructor constructor = person.getConstructor();//使用Class对象的newInstance方法获取反射类对象Object object = person.newInstance();//获取setName方法的Method对象,setName方法的参数类型为StringMethod setMethod = person.getMethod("setName", String.class);//   setMethod.setAccessible(true);//将参数值写入Method对象中Object setInvoke = setMethod.invoke(object, "李四");//获取Method对象中的getName方法Method getMethod = person.getMethod("getName");//获取Method对象中的getName方法的属性值Object getInvoke = getMethod.invoke(object);//输出得到的结果System.out.println(getInvoke);}
}
class Person implements Serializable{/*** */private static final long serialVersionUID = 1L;private String name;private char sex;private int weight;private int height;private String bitth;public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public String getBitth() {return bitth;}public void setBitth(String bitth) {this.bitth = bitth;}@Overridepublic String toString() {return "Person [name=" + name + ", sex=" + sex + ", weight=" + weight + ", height=" + height + ", bitth="+ bitth + "]";}}
package reflect;import java.io.Serializable;public class ReflectTest2 {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {Class forName = Class.forName("reflect.Person1");Person1 p=(Person1)forName.newInstance();p.setName("张三");String s = p.toString();System.out.println(s);}
}class Person1 implements Serializable{/*** */private static final long serialVersionUID = 1L;private String name;private char sex;private int weight;private int height;private String bitth;public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public String getBitth() {return bitth;}public void setBitth(String bitth) {this.bitth = bitth;}@Overridepublic String toString() {return "Person [name=" + name + ", sex=" + sex + ", weight=" + weight + ", height=" + height + ", bitth="+ bitth + "]";}}

什么是反射?为什么使用反射?相关推荐

  1. Java 反射 (快速了解反射)

    反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  2. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  3. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  4. 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. 【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在执行反射方法时 , 反射方法后 , 直接调用该方法 ; // 获取 View 的 getListenerInfo 方法 Method getLis ...

  6. 一篇文章弄懂Java反射基础和反射的应用场景

    文章目录 一.Java反射定义 二.Java反射机制实现 1.Class对象获取 2.获取class对象的摘要信息 3.获取class对象的属性.方法.构造函数等 三.反射的应用场景 1.动态代理 2 ...

  7. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  8. java反射模式_Java反射机制详解

    对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...

  9. java 反射 速度_Java 反射获取类方法速率和实现方式

    今天突然想到Java反射.然后测试了一下1.8.0_191版本的反射性能,没想到反射竟然比直接调用性能还高. 反射介绍 Java反射是指在程序运行状态中,能检查任意对象的内容并调用任意方法.对于任何一 ...

  10. java反射方法_java反射之方法反射的基本操作方法

    本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...

最新文章

  1. VSS、RSS、PSS、USS
  2. 业务工作流平台设计(七)
  3. ubuntu之路——day8.4 Adam自适应矩估计算法
  4. ArcEngine Hittest学习总结
  5. Android的一些疑问
  6. 区域数据导入功能(OCUpload插件使用)
  7. REST、SOAP、protocolbuf、thrift、avro
  8. html如何获取消息实体的长度,50道js面试题 XXXXX
  9. (安徽省地图)行政区划图高清矢量cdr|pdf(详细版2021年)
  10. 知识体系结构---备份
  11. DDD之一年级小学生作业辅导
  12. 使用maven-sql-plugin实现持续数据库集成(CDBI) [ 光影人像 东海陈光剑 的博客 ]
  13. 虚拟机开启系统蓝屏报错:“终止代码:SYSTEM_SERVICE_ECXEPTION“
  14. JAVA-TOMCAT环境变量的设置方法
  15. 676_AUTOSAR_TR_Methodology_文档阅读3
  16. CSDN的草稿箱在哪?/CSDN中如何看到上次写到一半未发布的文章呢?
  17. 印度加密独角兽 Matic 是怎样炼成的? |链捕手
  18. 【体系结构 三 流水线技术】
  19. 服务器常见故障判断与维修(上)
  20. 对现在的生活不满意?《围城》给你个人,婚姻,爱情的启示

热门文章

  1. gpt4和gpt3.5对比有什么提升?
  2. 按成绩统计各层次学生(附随机生成学生姓名和成绩),现已解决
  3. .NET 6 史上最全攻略
  4. php调用itunes,使用PHP将SQL列从秒转换为iTunes兼容的播客时间格式
  5. 苹果高级副总裁:移除部分屏幕时间控制应用是因为安全和隐私
  6. Unity 2021.1.15 ARCore环境配置与样例开发
  7. python中getattr()函数用法详解
  8. [网络基本概念] Router / Bridge
  9. python3:实现输出等边三角形、直角三角形
  10. HDU 5242 上海大都会 G题