java之——反射

news2025/1/21 16:43:01

文章目录

  • 反射的基本概念
    • 反射的概念
    • 反射的作用
  • 反射的基本信息
  • 反射的相关类型
    • Class类
      • Class类中的相关方法
      • newInstabce()
      • getName方法
    • Field类中的方法
      • getFiled()方法
      • getDeclareField(String name)
    • Constructor类
      • getConstructors()
      • getDeclaredConstructors()
    • Method类
      • getMethods()
      • getDeclaredMethod(String name, Class...<?> parameterTypes)
  • 反射的优缺点

反射的基本概念

反射的概念

什么是反射呢?反射机制是在运行状态对于一个任意的类都能够知道这个类的所有属性和方法,对于任意的一个对象,都能够调用它的任意方法和属性,既然能够拿到那么,我们就可以进行修改部分类型的信息,这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
这段话听起来生硬难懂,感觉难以理解,那么给大家翻译一下,其实反射就是java在运行的时候给自己开一个后门,我们都知道代码运行过程中我们的代码时不能进行修改的。可是一点办法都没吗?反射其实就是java给程序员开的一个后门。

反射的作用

  1. 反射相当于时程序员开的一个后门,我们在未来的开发中经常会遇到一些类他们的方法或者成员变量是私有的通过反射我们就可以使用这些私有的成员了。
  2. 反射最重要的还是底层框架开发比如在spring中,我们将所有的类Bean交给spring容器管理,无论是XML配置Bean还是注解配置,当我们从容器中获取Bean来依赖注入时,容器会读取配置,而配置中给的就是类的信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。

反射的基本信息

在java程序中许多对象在运行时会出现两种类型运行时类型和RTI编译时类型,类如Person p=new student();这句代码中p在编译时类型为person在运行时类型是student,程序需要在运行时发现对象和类的真实信息。而通过反射程序就能判断出该对象和类属于哪些类。

反射的相关类型

类名用途
Class类代表类的实体在运行的java程序中表示类和接口
Field类代表类的成员变量/类的属性
Method类代表类的方法
Constructor类代表类的构造方法

Class类

代表类的实体在运行的java程序中表示类和接口java文件被编译后会形成一个。class的字节码文件,jvm此时就要去解读.class文件,被编译过后的java文件,class也被jvm解析为一个对象,这个对象就是java.lang.Class这样当程序在运行时每个java文件最终变成了Class类对象的一个实例,我们通过java的反射机制应用道这个实例,就可以去获得甚至去添加改变这个类的属性和动作,使得这个类变成一个动态的类。

Class类中的相关方法

方法用途
getClassLoadar()获取类的加载器
getDeclaredClasses()返回一个数组数组中包含了所有类和接口类的对象(包括私有的)
forName(String className)根据类名返回类的对象
newlnstance()创建类的实例
getName()获得类的完整路径名字

forName用法

public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }

    }

这里的forName根据类名返回Class类的对象这个forName有什么作用呢?其实就是实例出一个Class的对象便于我们后期的使用,因为接下来我们想要实列化出相应的对象就需要此时实例出的cl这里我们也需要一个列子就是Student类

public class Student {

    //---------------构造方法-------------------
    //(默认的构造方法)
    Student(String str){
        System.out.println("(默认)的构造方法 s = " + str);
    }

    //无参构造方法
    public Student(){
        System.out.println("调用了公有、无参构造方法执行了。。。");
    }

    //有一个参数的构造方法
    public Student(char name){
        System.out.println("姓名:" + name);
    }

    //有多个参数的构造方法
    public Student(String name ,int age){
        System.out.println("姓名:"+name+"年龄:"+ age);//这的执行效率有问题,以后解决。
    }

    //受保护的构造方法
    protected Student(boolean n){
        System.out.println("受保护的构造方法 n = " + n);
    }

    //私有构造方法
    private Student(int age){
        System.out.println("私有的构造方法   年龄:"+ age);
    }
    public void show1(){
        System.out.println("show");
    }
    public int age;
    public String name;
    private String classmate;

}

newInstabce()

使用newInstabce方法可以创建类的实例,但是要注意这个方法返回的是一个Object对象我们需要进行类型转化代码如下

 public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
            Student se= (Student) cl.newInstance();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

    }

getName方法

该方法可以获得类的完整路径名称用法如下

 public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
            Student se= (Student) cl.newInstance();
            String packagename=cl.getName();
            System.out.println(packagename);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

    }

Field类中的方法

方法名称作用
getFiled(String Name)获得某个公有的属性
getFileds()获得公有的属性对象
getDeclaredField(String name)获得某个属性的对象
getDeclaredFields()获得所有属性的对象

getFiled()方法

getFiled(String Name)可以获得某个公有属性。用法如下

public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
            Student se= (Student) cl.newInstance();
            Field fe=cl.getField("name");
            System.out.println(fe);
            
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

    }

getDeclareField(String name)

此方法可以获得任意属性,其中也包括了私有属性使用如下

public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
            Student se= (Student) cl.newInstance();
            Field fe=cl.getField("name");
            System.out.println(fe);
            Field fe2=cl.getDeclaredField("classmate");
            System.out.println(fe2);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

    }

Constructor类

方法作用
getConstructor(Class…<?> parameterTypes)获得该类中与参数类型匹配的公有构造方法
getConstructors()获得该类的所有公有构造方法
getDeclaredConstructor(Class…<?> parameterTypes)获得该类中与参数类型匹配的构造方法
getDeclaredConstructors()获得该类所有构造方法

getConstructors()

获得该类中所有的公有构造方法

 public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
            Constructor[] se2=cl.getConstructors();
            for (Constructor neq:se2) {
                System.out.println(neq);
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

    }

getDeclaredConstructors()

获取所有的的构造方法包括私有的公有的等

 public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
            Constructor[] se2=cl.getConstructors();
            for (Constructor neq:se2) {
                System.out.println(neq);
            }
            System.out.println("___________________________");
            se2=cl.getDeclaredConstructors();
            for (Constructor se3:se2) {
                System.out.println(se3);
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

    }

在这里插入图片描述

Method类

方法作用
getMethod(String name, Class…<?> parameterTypes)获得该类某个公有的方法
getMethods()获得该类所有公有的方法
getDeclaredMethod(String name, Class…<?> parameterTypes)获得该类
getDeclaredMethods()获得该类所有方法

getMethods()

该方法可以获得该类中所有的公有方法

public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
            Method[] me=cl.getMethods();
            for (Method me2:me) {
                System.out.println(me2);
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

getDeclaredMethod(String name, Class…<?> parameterTypes)

该方法可以获取某个方法这里两个参数要输入的内容是方法名称以及其形参类型

public static void main(String[] args) {
        try {
            Class<?> cl=Class.forName("Student");
            Method[] me=cl.getMethods();
            Method me2=cl.getDeclaredMethod("show1",String.class);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (Exception e){
            System.out.println(e.fillInStackTrace());
        }

反射的优缺点

优点:

  1. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法

  2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力

  3. 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。
    缺点:

  4. 使用反射会有效率问题。会导致程序效率降低。具体参考这里

  5. 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更

     努力做好吧
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1495752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32使用标准库编写外部时钟控制oled显示计数(proteus仿真)

这节课的结果是在上节课的基础上更改的&#xff1a;电路图为&#xff1a;用一个开关来模拟外部时钟的高低电平的变化。 当然也可以配置一个外部时钟来模拟&#xff0c;也是可以的&#xff1a; 由于这节课的代码是在上节课的基础上有一点修改而来的&#xff0c;所以就只把更改的…

8、Linux-软件安装:rpm和yum;配置yum阿里云镜像源

一、介绍 Linux安装软件有两种方式&#xff0c; ①rpm&#xff1a;安装已有的安装包&#xff0c;类似于Windows中双击exe的安装包程序 ②yum&#xff1a;拉取远程仓库的文件&#xff0c;类似于python的pip install 区别&#xff1a;假设软件A依赖软件B&#xff0c;软件B依赖…

个推与华为深度合作,成为首批支持兼容HarmonyOS NEXT的服务商

自华为官方宣布HarmonyOS NEXT鸿蒙星河版开放申请以来&#xff0c;越来越多的头部APP宣布启动鸿蒙原生开发&#xff0c;鸿蒙生态也随之进入全新发展的第二阶段。 作为华为鸿蒙生态的重要合作伙伴&#xff0c;个推一直积极参与鸿蒙生态建设。为帮助用户在HarmonyOS NEXT上持续享…

git同步指定分支指定文件,可同步到同一仓库,可同步到不同仓库

源代码&#xff1a; run-func.js const express require(express); const fs require(fs); const simpleGit require(simple-git); const cors require(cors); // 引入 cors 模块const app express();// 使用 cors 中间件 app.use(cors());const git simpleGit().cwd(..…

OSPF NSSA实验简述

OSPF NSSA实验简述 1、OSPF NSSA区域配置 为解决末端区域维护过大LSDB带来的问题&#xff0c;通过配置stub 区域或totally stub区域可以解决&#xff0c;但是他们都不能引入外部路由场景。 No so stuby area &#xff08;区域&#xff09;NSSA 可以引入外部路由&#xff0c;支持…

C++小记 -链表

链表 文章目录 链表链表基础理论链表的类型单链表双链表循环链表 链表的存储方式链表的定义链表的操作添加节点删除节点 性能分析构建链表删除节点&#xff08;内存泄漏的坑&#xff09;1.直接移除2.使用虚拟头结点3.delete指针后&#xff0c;要将指针置为NULL&#xff01;&…

【python】对角线遍历

python系列文章目录 【python】基于cv2提取图片上的文本内容 【python】简单作图 【python】数组字符串等实用 【python】sort与sorted排序使用 【python】对角线遍历 python系列文章目录说明1.分析2.注意事项2.1 遍历2.2 区间2.3 顺序 3.代码实现 说明 给你一个大小为 m x n…

SpringCloud Feign实现微服务间的远程调用(黑马头条Day04)

目录 Feign介绍 Feign的执行流程 项目中使用Feign介绍 实现步骤 添加Feign依赖 注册feign远程调用接口&#xff0c;并指定需要调用的微服务 在leadnews-artilce微服务中创建接口实现类 在wemedia微服务中添加EnableFeignClients注解&#xff0c;并指定需要扫描的包 在wem…

突破编程_前端_JS编程实例(简单树结构组件)

1 开发目标 实现如下简单树结构组件&#xff1a; 再点击树节点后&#xff0c;会调用客户端传入的回调函数&#xff1a; 2 详细需求 简单树结构组件需根据客户端提供的参数创建&#xff0c;具备动态构建树形结构节点、选项卡切换及自定义内容显示等功能&#xff1a; &#xf…

R语言生物群落(生态)数据统计分析与绘图教程

原文链接&#xff1a;R语言生物群落&#xff08;生态&#xff09;数据统计分析与绘图教程 前沿 R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。 第一 R基础及数据准备 一&#xff1a;R和R…

【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目

作者推荐 视频算法专题 本文涉及知识点 树上倍增 树 图论 并集查找 换根法 深度优先 割点 LeetCode3067. 在带权树网络中统计可连接服务器对数目 给你一棵无根带权树&#xff0c;树中总共有 n 个节点&#xff0c;分别表示 n 个服务器&#xff0c;服务器从 0 到 n - 1 编号…

快速了解Redis

Redis是什么&#xff1f; Redis是一个数据库&#xff0c;是一个跨平台的非关系型数据库&#xff0c;Redis完全开源&#xff0c;遵守BSD协议。它通过键值对(Key-Value)的形式存储数据。 它与mysql数据库有什么区别&#xff1f; redis通过键值对(Key-Value)的形式存储数据&…

深入理解 Vuex:从基础到应用场景

前言 在之前的文章中&#xff0c;我们已经对 Vue.js 有了一定的了解。今天我们要对Vue官方的状态共享管理器Vuex进行详细讲解&#xff0c;将其基本吃透&#xff0c;目标是面对大多数业务需求&#xff1b; 一、介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用…

Rust入门:GCC或VS2019中的c或c++程序如何调用Rust静态库

首先创建一个rust的库&#xff0c;这里我假设命名为c-to-rust1 cargo new --lib c-to-rust1 其中&#xff0c;src/lib.rs的内容如下&#xff0c; #[no_mangle] pub extern "C" fn get_string() -> *const u8 {b"Hello C World\0".as_ptr() }注解 …

高分辨率全球海洋温度和盐度再分析数据Global Ocean Physics Reanalysis(0.083°),并利用matlab读取绘图

1.引言 在研究全球海平面变化的问题中&#xff0c;卫星测高获得总的海平面变化&#xff0c;而海平面变化包含质量变化和比容变化。因此测高数据和海洋物理分析数据对于海平面研究至关重要。 测高数据下载网址&#xff1a; Global Ocean Gridded L 4 Sea Surface Heights And …

【深度学习笔记】计算机视觉——FCN(全卷积网络

全卷积网络 sec_fcn 如 :numref:sec_semantic_segmentation中所介绍的那样&#xff0c;语义分割是对图像中的每个像素分类。 全卷积网络&#xff08;fully convolutional network&#xff0c;FCN&#xff09;采用卷积神经网络实现了从图像像素到像素类别的变换 :cite:Long.Sh…

Docker数据卷的挂载

目录 1 概念 2 常用命令 3 操作步骤(主要讲在创建容器时的挂载) 3.1 挂载在默认目录 3.2 挂载在自定义目录 4 附加内容(查看容器的挂载情况) 1 概念 数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。这样容器内…

如何恢复已删除的华为手机图片?5 种方式分享

不幸的现实是&#xff0c;华为的珍贵时刻有时会因为意外删除、软件故障或其他不可预见的情况而在眨眼之间消失。在这种情况下&#xff0c;寻求恢复已删除的图片成为个人迫切关心的问题。 本文旨在为用户提供如何从华为恢复已删除图片的实用解决方案。我们将探索五种可行的方法…

#微信小程序创建(获取onenet平台数据)

1.IDE&#xff1a;微信开发者工具 2.实验&#xff1a;创建一个小程序&#xff08;http get获取onenet平台数据&#xff09; 3.记录&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1eOd-2EnilnhPWoGUMj0fzw 提取码: 2023 &#xff08;1&#xff09;新建一个工…

CentOS/Fedora/Ubuntu/Debian 系统 wget 命令

wget 是云服务器安装环境和面板常用下载命令。下载软件或从远程服务器下载备份到本地服务器&#xff0c;也可以使用 wget 把文件下载到云服务器上。 VPS wget 命令最常用使用方法如下&#xff1a; 安装 wget 一般来说 wget 命令是系统自带的&#xff0c;方面安装环境和面板&…