反射的相关内容

news2024/11/13 8:00:22

目录

一、什么是反射

二、为什么会有反射

三、反射是如何工作的

获取类信息的三种方式:

例:

四、获取类信息并调用

1.获取

(1)获取变量

获取全部类信息

获取public修饰的 

获取指定某一个 

(2)获取方法

获取全部类信息

获取public修饰的  

获取指定某一个  

(3)获取构造器

获取全部类信息

获取public修饰的 

获取指定某一个 

2.获取后调用 

(1)获取构造器后调用

(2)获取方法之后调用

(3)获取变量之后调用


一、什么是反射

反射是一种获取类信息的能力

类信息:方法、变量、接口、构造器、类名……

二、为什么会有反射

因为有时候需要获取类信息

创建对象也可以获取类信息,但是这种方式获取的类信息非常有限,所以需要用到反射

三、反射是如何工作的

要想获取类信息,就必须回到类对象阶段

获取类信息的三种方式:

1.Class.forName("全类名")---------磁盘阶段

2.类名.class-----------类对象阶段

3.对象名.getClass()----------------运行时阶段 

例:

Student类

public Student{
    private String name;
}

Test类

public class Test{
     public static void main(String[] args){
        //1.
        Class class1=Class.forName("cn.edu.bdu.mc.Student");
        //2.
        Class class2=Student.class;
        //3.
        Student student=new Student();
        Class class3=student.getClass();
    }
}

四、获取类信息并调用

Student类

public class Student {
    //变量
    private String name="张三";
    public Integer age=18;
    Character sex='男';
    protected Double height=185.5;
    public String color="蓝色";
    //方法
    public void run(){
        System.out.println("这是run()");
    }
    private int getAge(int age){
        System.out.println("这是age()");
        return age;
    }
    void aaa(String name,Integer height){
        System.out.println("这是aaa()");
    }
    protected void bbb(String name,int age){
        System.out.println("这是bbb()");
    }
    //构造器
    private Student(){}
    Student(String name,Integer age){}
    public Student(String name, Integer age, Character sex, Double height, String color) 
    {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.height = height;
        this.color = color;
    }
}

Test类中的main()方法中:


1.获取

(1)获取变量

获取全部类信息
System.out.println("获取全部类信息并打印");

Field[] files=class1.getDeclaredFields();

for(Field file:files){

    System.out.println(file);

}

获取public修饰的 
System.out.println("获取public修饰的全局变量信息并打印");

Field[] files1=class1.getFields();

for(Field field:files1){

    System.out.println(field);

}

获取指定某一个 
System.out.println("获取指定某一个并打印");

(1)加Declared:

Field nameField= class1.getDeclaredField("name");

System.out.println(nameField);

Field heightField=class1.getDeclaredField("height");

System.out.println(heightField);

Field ageField=class1.getDeclaredField("age");

System.out.println(ageField);

(2)不加Declared:

System.out.println("------------------------------------");

Field nameField1= class1.getField("name");

System.out.println(nameField1);

System.out.println("------------------------------------");

Field heightField1=class1.getField("height");

System.out.println(heightField1);

System.out.println("------------------------------------");

Field ageField1=class1.getField("age");

System.out.println(ageField1);

可以得出方法上加Declared能获取全部的信息,不加Declared只能获取public修饰的

(2)获取方法

获取全部类信息
System.out.println("获取全部类信息并打印");
Method[] declaredMethods=class1.getDeclaredMethods();
for(Method declaredMethod:declaredMethods){
    System.out.println(declaredMethod);
}

获取public修饰的  
System.out.println("获取public修饰的方法和父类的信息并打印");
Method[] methods=class1.getMethods();
for(Method method:methods){
    System.out.println(method);
}

获取指定某一个  
System.out.println("获取指定的方法");
Method getAge=class1.getDeclaredMethod("getAge", int.class);
System.out.println(getAge);
Method aaa=class1.getDeclaredMethod("aaa", String.class, Integer.class);
System.out.println(aaa);
Method run=class1.getDeclaredMethod("run");
System.out.println(run);
Method bbb=class1.getDeclaredMethod("bbb", String.class, int.class);
System.out.println(bbb);

System.out.println("----------------------------------------");
Method run1=class1.getMethod("run");
System.out.println(run1);

System.out.println("----------------------------------------");
Method bbb1=class1.getMethod("bbb", String.class, int.class);
System.out.println(bbb1);

可以得出方法上加Declared能获取全部的信息,不加Declared只能获取public修饰的

(3)获取构造器

获取全部类信息
System.out.println("获取全部类信息并打印");
Constructor[] constructors=class1.getDeclaredConstructors();
for(Constructor constructor:constructors){
    System.out.println(constructor);
}

获取public修饰的 
System.out.println("获取public修饰的方法和父类的信息并打印");
Constructor[] constructors1=class1.getConstructors();
for(Constructor constructor1:constructors1){
    System.out.println(constructor1);
}

获取指定某一个 
System.out.println("获取指定某一个");
Constructor constructor=class1.getDeclaredConstructor();
System.out.println(constructor);
Constructor constructor1=class1.getDeclaredConstructor(String.class,Integer.class);
System.out.println(constructor1);
Constructor constructor2=class1.getDeclaredConstructor(String.class,Integer.class,Character.class,Double.class,String.class);
System.out.println(constructor2);

System.out.println("---------------------------------");
Constructor constructor0=class1.getConstructor();
System.out.println(constructor);

 

Constructor constructor20=class1.getConstructor(String.class,Integer.class,Character.class,Double.class,String.class);
System.out.println(constructor2);

2.获取后调用 

(1)获取构造器后调用

System.out.println("获取构造器之后调用");
//public修饰的构造器
Constructor declaredConstructor=class1.getDeclaredConstructor(String.class,Integer.class);
//获取到构造器之后创建对象
Student student1=(Student) declaredConstructor.newInstance("aaa",18);//强转
//private修饰的构造器
Constructor declaredConstructor1=class1.getDeclaredConstructor();
//private修饰的数据,要使用就必须暴力反射(public和defined不用)
declaredConstructor1.setAccessible(true);//暴力反射
Student student2=(Student) declaredConstructor1.newInstance();

(2)获取方法之后调用

System.out.println("获取方法之后调用");
Method run=class1.getDeclaredMethod("run");
//调用
run.invoke(student1);//要想运行,就必须开辟内存空间,所以要把student1传进去

Method getAge=class1.getDeclaredMethod("getAge", int.class);
getAge.setAccessible(true);//暴力反射
getAge.invoke(student1,10);

Method bbb=class1.getDeclaredMethod("bbb", String.class, int.class);
bbb.invoke(student1,"张三",20);

Method aaa=class1.getDeclaredMethod("aaa", String.class, Integer.class);
aaa.invoke(student1,"admin",190);

(3)获取变量之后调用

System.out.println("获取变量之后调用");
Field nameField= class1.getDeclaredField("name");
nameField.setAccessible(true);//暴力反射
nameField.set(student1,"李四");//赋值
System.out.println(nameField.get(student1));//输出

Field ageField=class1.getDeclaredField("age");
ageField.set(student1,10);
System.out.println(ageField.get(student1));

Field sex=class1.getDeclaredField("sex");
sex.set(student1,'女');
System.out.println(sex.get(student1));

Field heightField=class1.getDeclaredField("height");
heightField.set(student1,120.00);//不能写120,,120.0也可以
System.out.println(heightField.get(student1));

Field color=class1.getDeclaredField("color");
color.set(student1,"红色");
System.out.println(color.get(student1));

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

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

相关文章

【新手上路】衡石分析平台使用手册-租户管理

租户管理​ 衡石系统支持服务一个平台方和多个企业客户的租户模式,平台方管理租户,为租户提供数据,租户在系统内进行数据分析。 衡石系统增加工作空间的设计,在平台方和租户之间提供单向的传递通道,平台厂商可以轻松…

C++map,set,multiset,multimap详细介绍

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set set的介绍 set的使用 1. set的模板参数列表 2. set的构造 3. set的迭代器 4. set的容量 5. set的修改操作 6. set的使用举例 ​3.2 map map的介绍 map的使用 1. map的模板参数声明 2. map的构造 …

实例讲解电动汽车钥匙ON挡上下电控制策略及Simulink建模方法

在电动汽车VCU开发中,上下电控制是其中一个核心控制内容,也是其他控制功能的基础,而钥匙ON挡上下电又是整车上下电的基础。本文介绍电动汽车钥匙ON挡上下电的控制策略及Simulink建模方法。 目录 一、整车高压原理 二、钥匙ON挡上下电控制策…

计算机毕业设计 办公用品管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(一)

目录 自动化介绍 bord 边框宽度 随机函数 fsvp 随机颜色 move 自动化介绍 自动化介绍:简单来说自动化能让所有字幕行快速拥有你指定的同一种特效 对时间不同的行应用相同的效果 只要设计好一个模板,然后让所有行都执行这个模板上的特效就好了 首先制作模板行…

kafka消息发送几种方式

同步发送 or 异步发送 消息发送根据是否需要处理发送的结果分为同步发送、异步发送。 同步发送:等待发送结果返回,这种方式是可靠的,因为异常能及时处理,但同步发送需要阻塞等待一条消息发送完才处理下一条,吞吐量差。…

esp32核心跑分程序

https://github.com/ochrin/coremark/tree/esp32 最近一直捣腾esp32s3 (Sense) 做微型摄像。过程中发现一款不错的跑分软件,特此记一笔。 其中针对esp32s3各类参数设定(用idf.py menuconfig),做个记录。 CPU Frequency去240MHz&#xff08…

探索网络世界:TCP/IP协议、Python Socket编程及日常生活比喻

网络介绍 🌐 网络就像是一个无形的纽带,把我们所有人👫👫👫紧紧相连。没有网络的世界,就像是失去了色彩的画布,多么的单调和无趣啊!🎨 单机游戏 🎮 单机游…

ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计

起因, 目的: 客户需求, 就是要设计一个数据库。 过程, 关于工具: UI 设计,我最喜欢的工具其实是 Canva, 但是 Canva 没有合适的模板。我用的是 draw.io, 使用感受是,很垃圾。 各种快捷键不适应,箭头就是点不住&…

VuePress搭建文档网站/个人博客(详细配置)主题配置

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

JavaEE初阶——初识EE(Java诞生背景,CPU详解)

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 零:Java的发展背景介绍 一:EE的概念 二:计算机的构成 1:CU…

Python面试宝典第50题:分割等和子集

题目 给你一个只包含正整数的非空数组nums,请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1, 5, 11, 5] 输出:True 解释:数组可以分割成[1, 5, 5]和[11]。 示…

C++之第十二课

课程列表 哎呀呀,失踪人口回归了!(前段时间跑去B站了,久等了) 今天来讲——数组 有一道题是这样的: 有n个数,请输出其中最大的数。 原来我们就要: int a,b,c... 但是——数组…

Golang开发的OCR-身份证号码识别(不依赖第三方)

身份证号码识别(golang) 使用golang的image库写的身份证号码识别,还有用了一个resize外部库,用来更改图片尺寸大小,将每个数字所在的图片的大小进行统一可以更好的进行数字识别,库名 :“github…

ARM 工业边缘计算机与 C# 编程的完美融合

在工业领域,随着智能化和数字化的不断推进,ARM 工业边缘计算机凭借其出色的性能和低功耗等优势,逐渐成为众多应用场景的重要支撑。而 C# 编程语言的强大功能和广泛适用性,使其在与 ARM 工业边缘计算机的结合中展现出了巨大的潜力。…

Python | Leetcode Python题解之第415题字符串相加

题目: 题解: class Solution:def addStrings(self, num1: str, num2: str) -> str:res ""i, j, carry len(num1) - 1, len(num2) - 1, 0while i > 0 or j > 0:n1 int(num1[i]) if i > 0 else 0n2 int(num2[j]) if j > 0 e…

C++ -命名空间-详解

博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ C -命名空间-详解 1.C语言缺点之一 -- 命名冲突2.命名空间2.1定义2.2使用访问命名空间中的变量展开命名空间域指定访问命名空间域 2.3其他功能 3.C 标准库中的命名空间指定展开…

华为OD机试 - 二维伞的雨滴效应(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

徒增成本,还是有备无患?说说4G模组SIM双卡切换

初学开发的小伙伴提出疑问: 手机双卡可以理解,人情世故各种缘由…… 物联网设备有必要双卡吗,会不会太浪费? 实际应用中,双卡可不是徒增成本的摆设,而是有备无患的必需。 在使用4G模组双卡功能的场景下&a…

2024年数学建模比赛题目及解题代码

目录 一、引言 1. 1竞赛背景介绍 1.1.1数学建模竞赛概述 1.1.2生产过程决策问题在竞赛中的重要性 1.2 解题前准备 1.2.2 工具与资源准备 1.2.3 心态调整与策略规划 二、问题理解与分析 三、模型构建与求解 3.1 模型选择与设计 3.1.1 根据问题特性选择合适的数学模型类…