首页 > 编程语言 >Java中的反射机制

Java中的反射机制

时间:2023-06-30 17:33:42浏览次数:45  
标签:反射 Java System public println 机制 out Class cls

一、反射简介

(一)什么是反射

​ Java的反射 (reflection) 机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

(二)反射能做什么

​ 1、在运行时判断任意一个对象所属的类;

​ 2、在运行时构造任意一个类的对象;

​ 3、在运行时判断任意一个类所具有的成员变量和方法;

​ 4、在运行时调用任意一个对象的方法;

​ 5、生成动态代理。

(三)为什么需要反射机制

1、动态类型、静态类型语言

​ 动态类型语言:所谓动态类型语言,就是类型的检查是在运行时才做。动态类型在解释语言中极为普遍,如JavaScript、Python、Ruby等等。

​ 静态类型语言:静态类型语言的类型检查是在运行前的编译阶段,比如C#、Java 等都是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要。Java是在编译时期确定的变量类型且在运行时期不能改变,在类型转换方面也是强制的,例如大范围整数类型转换为小范围整数类型时必须要强转,如int必须强制转换才能得到小范围类型byte;所以Java是静态、强类型语言。

​ 但是 JAVA 有着一个非常突出的动态相关机制一Reflection(反射),用在Java身上指的是可以于运行时加载、探知、使用编译期间完全知的 classes。换句话说,Java程序可以加载一个运行时才得知名称的 class 获悉其完整构造(但不包括methods定义),并生成其对象例(newlnstance) 或对其 fields 设值,或唤起 (invoke) 其methods方法。

2、开闭原则

​ 为什么在这里提开闭原则,是因为反射也能够在不修改源码的情况下对原有代码进行 ”功能增强“。

​ Software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification。即:软件实体(模块、类、方法等) 应该“对扩展开放、对修改关闭”。抽象化是开闭原则的关键。 对可变性进行封装是实现抽象化的方法。

​ 即添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法 等)。

二、反射引入

​ 假设有下面的类 Person,我们在配置文件中存储了这个类的位置信息以及里面含有的方法。下面的要求就是在不知道这个 Person 类的内部情况下如何创建它的实例对象并且调用里面的方法。

classfullpath = com.purearc.bringin.Cat
method = hi
/**
 * date: 2023/6/25
 * 省略 getter、setter 和有参无参 Constructor
 * @author Arc
 */
package com.purearc.bringin;

public class Cat {
    private String name = "defaultName";
    public int age = 10;

    public void hi(){
        System.out.println("sayHi");
    }
}

​ 首先就是读取 properties 文件,通过 I/O 流读取到内存中(读取进去是以 map 的键值对形式存储)根据 key 获取 value 值之后转化成 String 字符串我们就在不打开文件的情况下获取了 Person 的全路径类名和它内部的方法名。

/**
 * date: 2023/6/25
 *
 * @author Arc
 */
package com.purearc.bringin;

public class ReflectBringIn {
    public static void main(String[] args) throws Exception {

        Properties properties = new Properties();
        properties.load(new FileInputStream("src/main/resources/re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        //System.out.println(classfullpath);
        //System.out.println(method);
    }
}

​ 下一步就是通过 java 的反射机制来达到构造实例对象、调用成员方法的过程:

​ 1、通过 Class 类的静态方法 forName(String param); 获得一个 cls 对象,该对象的类型就是 Class,就相当于我的名字叫“名字”;

​ 2、通过 cls 对象的 newInstance(); 方法获得一个 Object 对象的实例 o;

​ 3、通过 cls 对象的 getMethond(); 方法获得 Person 的内置方法,返回的是一个 Methond 的类对象,就相当于把 “方法” 也看作是 “对象”,在反射中再一次印证了 “Java 中一切皆对象” 这句话。

标签:反射,Java,System,public,println,机制,out,Class,cls
From: https://www.cnblogs.com/purearc/p/17517415.html

相关文章

  • Java 网络爬虫,就是这么的简单
    是Java网络爬虫系列文章的第一篇,如果你还不知道Java网络爬虫系列文章,请参看学Java网络爬虫,需要哪些基础知识。第一篇是关于Java网络爬虫入门内容,在该篇中我们以采集虎扑列表新闻的新闻标题和详情页为例,需要提取的内容如下图所示: 我们需要提取图中圈出来的文字及其对......
  • 使用easy-captcha验证码出现javax. script ScriptEngine.eval(String)" because "engi
    1.问题java项目使用  ArithmeticCaptcha  验证码,出现javax.scriptScriptEngine.eval(String)"because"engine"isnulArithmeticCaptchacaptcha=newArithmeticCaptcha(111,36);<dependency><groupId>com.github.whvcse</groupId>......
  • Java PTA第4~5次题目集总结以及期中考试总结
    一.前言1.第四次题目集的知识点涉及Time类以及前面学的各种知识点;题量很少只有一题;难度比较大。2.第五次题目集的知识点主要是Time类、异常处理等等;题量很少只有一题;难度比较大。3.期中考试的知识点涉及类、继承与多态、接口等等;题量不多,一共4题;整体难度不高。二.设计与分析7......
  • JavaScript实现Fly Bird小游戏
    1.分析页面结构,理清需求和功能游戏有三个界面,分别是开始界面,游戏界面和游戏结束界面。1.1开始界面 游戏的大背景上下移动的游戏标题和翅膀摆动的小鸟start按钮,点击进入游戏界面一直移动的地面1.2游戏界面显示越过障碍数量的计分器移动的障碍物,分别是上管道和下......
  • JavaScript中数组常用方法汇总!
    数组是一个复杂数据类型,我们在操作它的时候就不能再想基本数据类型一样操作了。比如我们想改变一个数组//创建一个数组vararr=[1,2,3]//我们想把数组变成只有1和2arr=[1,2]这样肯定是不合理,因为这样不是在改变之前的数组。相当于重新制作了一个数组给到arr......
  • Java学习------Maven下载配置教程
    1.下载Maven地址:https://maven.apache.org/download.cgi  2.解压到除C盘和桌面的其他盘符下的myMaven文件夹下    3.配置右键点击我的电脑,点击属性一栏,找到高级系统设置,点击环境变量并找到path进行编辑。(和配置JDK的环境变量一致,如有不懂,前面文章中有提到配置......
  • es更新部分字段内容java
    publicBooleanupdateArray(StringindexName,QueryBuilderqueryBuilder,Map<String,Object>params)throwsIOException{UpdateByQueryRequestupdateByQuery=newUpdateByQueryRequest();updateByQuery.indices(indexName);updateByQuery.set......
  • Vue3 vite:is a JavaScript file. Did you mean to enable the 'allowJs' option?
    描述今天在vue3+vite下进行打包时,突然vscode报了一个error。 大概的意识是询问是否启用“allowJS”选项,因为该文件在程序内是指定用于编译的根文件。提示信息已经很明确了,下面从网上摘抄了下什么是allowJS选项。allowJs是1.8中新提供的选项。TypeScrip......
  • Java 事务管理@Transactional注解rollbackFor回滚属性,事务的传播行为propagation(REQUI
    事务管理Java事务管理@Transactional注解rollbackFor属性所有的异常都回滚;事务的传播行为propagation(REQUIRED,REQUIRES_NEW)01.事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时......
  • CNN GRU 注意力 时序预测 基于加注意力机制(CNN-GRU-Attention)的时间序列预测程序,预测
    CNNGRU注意力时序预测基于加注意力机制(CNN-GRU-Attention)的时间序列预测程序,预测精度很高。可用于做风电功率预测,电力负荷预测,交通预测,负荷预测,经济预测,排放预测等标记注释清楚,可直接换数据运行。代码实现训练与测试精度分析。原创文章,转载请说明出处,资料来源:http://imgcs.......