【Java】---反射:Class、Filed、Constructor、Method

【Java】—反射


文章目录

  • 【Java】---反射
  • 一、反射
    • 1.1 概念
    • 1.2 操作步骤
  • 二、Class类
    • 2.1 概念
    • 2.2 方法
      • 2.2.1 getName()
      • 2.2.2 getSimpleName()
      • 2.2.3 getPackage()
      • 2.2.4 getSuperclass()
      • 2.2.5 getInterfaces()
  • 三、Field类
    • 3.1 概念
    • 3.2 方法
      • 3.2.1 setAccessible(Boolean b)
      • 3.2.2 set(Object obj,Object value)
  • 四、Constructor
    • 4.1 概念
    • 4.2 方法
      • 4.2.1 newInstance(参数1,参数2,..)
  • 五、Method
    • 5.1 概念
  • 总结


一、反射

1.1 概念

把Java类中的各种成分映射成单独的Java对象进行操作。
换言之,如果类是小白鼠的话,反射就是对其一系列的解剖操作。
类中的成分包括:类和类的成员信息类的构造方法类的方法类的属性

对于类中的这些成分,有专门的类用于获取:
Class类:可获取类和类的成员信息。
Field类:可访问类的属性。
Method类:可调用类的方法。
Constructor类:可调用类的构造方法。

1.2 操作步骤

反射的操作步骤有以下这些:

  1. 获取类对象。
  2. 获取类的基本信息。
  3. 获取类的构造方法。
  4. 获取类的方法。
  5. 获取类的属性。

二、Class类

2.1 概念

Class类是 类的类型 ,每一个类都是Class类的实例,每个类只有一个Class实例(类对象)。
Class类是反射中专门用于获取 类和类的成员信息 的类。

需要处理异常:ClassNotFoundException
ClassNotFoundException

类对象的创建共有三种方式:

  1. 通过类的实例获取。(此方法耦合性高,不推荐)
Student zhangsan = new Student();
Class<?> class1 = zhangsan.getClass();
  1. 通过class属性获取。(此方法耦合性高,不推荐)
Class<?> class2 = Student.class;
  1. 通过静态方法Class.forName()获取。(此方法耦合性低,推荐!)
Class<?> class3 = Class.forName("Student");

2.2 方法

2.2.1 getName()

作用:获取类的全名称(包含包名)
返回值类型:String

代码演示:
Student类中:

public class Student{
}

主类中:

Class<?> class1 = Class.forName("Demo1.Student");
System.out.println(class1.getName());

运行结果:

Demo1.Student

2.2.2 getSimpleName()

作用:获取类的简单名称(不包含包名)
返回值类型:String

代码演示:
Student类中:

public class Student{
}

主类中:

Class<?> class1 = Class.forName("Demo1.Student");
System.out.println(class1.getSimpleName());

运行结果:

Student

2.2.3 getPackage()

作用:获取类所在包的名称
返回值类型:String

代码演示:
Student类中:

public class Student{
}

主类中:

Class class1 = Class.forName("Demo1.Student");
System.out.println(class1.getPackage());
System.out.println(class1.getPackage().getName());

运行结果:

package Demo1
Demo1

2.2.4 getSuperclass()

作用:获取类的父类名称。
返回值类型:String

代码演示:
Person类中:

public class Person{//Person类没有指定继承的类,默认直接继承Object类
}

Student类中:

public class Student extends Person{//Student类继承了Person类
}

主类中:

Class class1 = Class.forName("Demo1.Person");
Class class2 = Class.forName("Demo1.Student");
System.out.println("Person类的父类:");
System.out.println(class1.getSuperclass());
System.out.println(class1.getSuperclass().getName());
System.out.println("Student类的父类:");
System.out.println(class2.getSuperclass());
System.out.println(class2.getSuperclass().getName());

运行结果:

Person类的父类:
class java.lang.Object
java.lang.Object
Student类的父类:
class Demo1.Person
Demo1.Person

2.2.5 getInterfaces()

作用:返回类所实现的所有接口
返回值类型:Class<?>[ ]

代码演示:

See接口:

public interface See{//看}

Hear接口:

public interface Hear{//听} 

Smell接口:

public interface Smell{//闻}

Taste接口:

public interface Taste{//尝
}

Person类:

public class Person implements See,Hear,Smell,Taste{//实现了看、听、闻、尝四个接口
}

主类中:

Class class1 = Class.forName("Demo1.Person");
Class[] class2 = class1.getInterfaces();
for(Class c : class2)System.out.println(c);

运行结果:

interface Demo1.See
interface Demo1.Hear
interface Demo1.Smell
interface Demo1.Taste


三、Field类

3.1 概念

Filed类是反射中专门用于获取 类的属性 的类。
Filed类在获取获取类的属性之前,需要先获取类对象。

Student类:

public class Student{String name;private String gender;
}

主类中:

Class class1 = Class.forName("Demo1.Student");
Field name = class1.getField("name");//getField方法只能获取public修饰的属性
Field gender = class1.getDeclaredField("gender");//getDeclaredField方法可以获取任意访问修饰符修饰的属性

3.2 方法

3.2.1 setAccessible(Boolean b)

作用:设置访问修饰符是否有效,true为无效,false为有效,用于后续的修改。
返回值类型:void(无)

Student类中:

public class Student{private String name;
}

主类中:

Class class1 = Class.forName("Demo1.Student");
Field name = class1.getDeclaredField("name");
name.setAccessible(false);//解除private的限制

3.2.2 set(Object obj,Object value)

作用:设置对象相应属性的属性值
返回值类型:void(无)

Student类中:

public class Student{private String name;private String gender;private int age;Student(){}Student(String name,String gender,int age){this.name = name;this.gender = gender;this.age = age;}public String toString() {return "Student{" +"name='" + name + '\'' +", gender='" + gender + '\'' +", age=" + age +'}';}}

主类中:

Class class1 = Class.forName("Demo1.Student");
Field name = class1.getDeclaredField("name");
Field gender = class1.getDeclaredField("gender");
Field age = class1.getDeclaredField("age");
Student stu = new Student("张三","男",18);
System.out.println("修改前:");
System.out.println(stu);name.setAccessible(true);//取消访问修饰符的限制
name.set(stu,"李娜");
gender.setAccessible(true);//取消访问修饰符的限制
gender.set(stu,"女");
age.setAccessible(true);//取消访问修饰符的限制
age.set(stu,22);System.out.println("修改后:");
System.out.println(stu);

运行结果:

修改前:
Student{name=‘张三’, gender=‘男’, age=18}
修改后:
Student{name=‘李娜’, gender=‘女’, age=22}


四、Constructor

4.1 概念

Constructor类是反射中专门用于获取 类的构造方法 的类。
需要处理异常:NoSuchMethodException

Constructor类在获取获取类的构造方法之前,需要先获取类对象。

Student类中:

public class Student{private String name;private String gender;private int age;	public Student(){//使用了public修饰}Student(String name,String gender,int age){//未使用任何访问修饰符修饰this.name = name;this.gender = gender;this.age = age;}
}

主类中:

Class class1 = Class.forName("Demo1.Student");
//获取无参构造方法
//getConstructor方法只能构造方法必须是public
Constructor cons1 = class1.getConstructor();
//获取有参构造方法,参数为构造方法的类型
//getDeclaredConstructor方法可以访问任意修饰符修饰的方法
Constructor cons2 = class1.getDeclaredConstructor(String.class,String.class,int.class);

4.2 方法

4.2.1 newInstance(参数1,参数2,…)

作用:创建具有无参构造方法,或具有多个参数方法的对象,需要向下转型。
返回值类型:Object

Student类中:

public class Student{private String name;private String gender;private int age;Student(){//无参构造方法}Student(String name,String gender,int age){//有参构造方法,没有使用修饰符修饰this.name = name;this.gender = gender;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", gender='" + gender + '\'' +", age=" + age +'}';}
}

主类中:

Class class1 = Class.forName("Demo1.Student");
Constructor cons1 = class1.getDeclaredConstructor(String.class,String.class,int.class);
Student stu = (Student)cons1.newInstance("赵六","男",56);
Student stu2 = cons1.
System.out.println(stu);

运行结果:

Student{name=‘赵六’, gender=‘男’, age=56}


五、Method

5.1 概念

Method是反射中专门用于获取 类的方法 的类。
需要处理异常:NoSuchMethodException

invoke:用于执行方法

Method类在获取获取类的方法之前,需要先获取类对象。

Student类中:

public class Student{private String name;private String gender;private static int count;//学生数量private int age;public void show(){System.out.println(name + " " + gender + " " + age + " ");}public void setName(String name){this.name = name;	}public void getName(){return this.name;}public static int getStudentCount(){return count;}
}

主类中:

Class class1 = Class.forName("Demo1.Student");
//getmethod只能获取public修饰的方法
//获取无参无返回值方法
Method show = class1.getMethod("show");
//获取有参无返回值方法
Method setName = class1.getMethod("setName",String.class);
//获取有返回值的方法
Method getName = class1.getMethod("getName");
Student stu = new Student("张三","男",18);
String s = (String)getName.invoke(stu);
//获取静态方法
Method getStudentCount = class1.getMethod("getStudentCount");
int count = getStudentCount.invoke(null);

总结

今天这篇文章讲解了反射,以及关于反射操作的四个类:Class、Filed、Constructor、Method。

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

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

相关文章

关于图像分割项目的可视化脚本

1. 前言 之前实现了目标检测和图像分类任务的可视化脚本&#xff0c;本章将最后一个分割任务的可视化脚本实现 效果展示如下&#xff1a; 代码会在当前目录保存展示好的图片&#xff0c;从左到右依次为&#xff0c;原图、mask图、mask覆盖在原图的掩膜图 关于目标检测的可视化…

【二】从零到1设计一个丧葬行业小程序

1、准备工作 1-1、服务器准备 腾讯云轻量级服务器 4核2G 地址: http://1.14.34.13/ 购买域名 www.pengyangyan.work &#xff08;备案中&#xff09; 图片服务器&#xff1a;七牛云 1-2、环境配置 服务器 docker容器部署 https://blog.csdn.net/pengyangyan/article/d…

app如何实现悬浮框滚动到那个模块定位到那。

如图&#xff1a; 使用uniapp内置方法 onPageScroll 获取到滚动了多少。 其实拿到屏幕滚动多少就很简单了&#xff0c;下面是思路。 tap栏切换效果代码就不贴了。直接贴如何到那个模块定位到哪&#xff0c;和点击定位到当前模块。 <view v-if"show" class&qu…

HarmonyOS鸿蒙应用开发( 四、重磅组件List列表组件使用详解)

List列表组件&#xff0c;是一个非常常用的组件。可以说在一个应用中&#xff0c;它的身影无处不在。它包含一系列相同宽度的列表项&#xff0c;适合连续、多行呈现同类数据&#xff0c;如商品列表、图片列表和和文本列表等。ArkUI 框架采用 List 容器组件创建列表&#xff08;…

某国有企业后备人才培养机制建设

某电力勘测设计院始建于1958年&#xff0c;是中国电力建设集团有限公司旗下的大型电力工程咨询公司。伴随着中国电力事业的发展&#xff0c;已发展为具备甲级电力工程规划、咨询、勘测、设计、总承包、环境及安全管理评价、地质灾害勘察、评估与治理、光电建筑一体化及发电专项…

大数据学习之Flink算子、了解DataStream API(基础篇一)

DataStream API &#xff08;基础篇&#xff09; 注&#xff1a; 本文只涉及DataStream 原因&#xff1a;随着大数据和流式计算需求的增长&#xff0c;处理实时数据流变得越来越重要。因此&#xff0c;DataStream由于其处理实时数据流的特性和能力&#xff0c;逐渐替代了DataSe…

Windows下安装达梦8开发版数据库

达梦数据库属于国产主流数据库之一&#xff0c;本文记录WIndows下安装最新的达梦8数据库的过程。   达梦官网&#xff08;参考文献1&#xff09;下载开发版&#xff08;X86平台&#xff09;版安装包&#xff0c;如下图所示&#xff1a; 解压安装包后&#xff0c;其中包含ISO文…

Unity中UGUI在Mask剪裁粒子特效的实现

在Unity使用Mask是剪裁不了粒子特效的&#xff0c;之前有想过RenderTexture来实现&#xff0c;不过使用RenderTexture不适合用于很多个特效&#xff0c;因为RenderTexture依赖Camera的照射&#xff0c;如果在背包中每种道具都有不同的特效&#xff0c;那使用RenderTexture则需要…

Armv8-M的TrustZone技术之SAU寄存器总结

每个SAU寄存器是32位宽。下表显示了SAU寄存器概要。 5.1 SAU_CTRL register SAU_CTRL寄存器的特征如下图和表所示&#xff1a; 5.2 SAU_TYPE register 5.3 SAU_RNR register 5.4 SAU_RBAR register 5.5 SAU_RLAR register 5.6 SAU区域配置 当SAU启用时&#xff0c;未由已启用…

【技术】SpringBoot 接口怎么加密解密

1. 介绍 在我们日常的Java开发中&#xff0c;免不了和其他系统的业务交互&#xff0c;或者微服务之间的接口调用 如果我们想保证数据传输的安全&#xff0c;对接口出参加密&#xff0c;入参解密。 但是不想写重复代码&#xff0c;我们可以提供一个通用starter&#xff0c;提…

go 依赖注入设计与实现

在现代的 web 框架里面&#xff0c;基本都有实现了依赖注入的功能&#xff0c;可以让我们很方便地对应用的依赖进行管理&#xff0c;同时免去在各个地方 new 对象的麻烦。比如 Laravel 里面的 Application&#xff0c;又或者 Java 的 Spring 框架也自带依赖注入功能。 今天我们…

C++高精度问题

高精度前言 C中int不能超过2^31-1&#xff0c;最长的long long也不能超过2^63-1,所以我们在题目中如果碰到了很长很长的数&#xff0c;并且需要进行大数运算时&#xff0c;就需要高精度存储。 高精度总体思路 由于int和long long的限制&#xff0c;我们要想存放很长的数就需…

Power Apps 向Power Automate传一个数组参数

Power Apps传Power Automate数组参数 背景Power Apps传参方法画布开发我们现在power apps中设置一个集合**ArrCollect**准备一个按钮 Power Automate接收总结画布流 背景 我们通常会从Power Apps界面传递参数给Flow中&#xff0c;但是很多时候仅仅是一个字符串类型的已经不适用…

二进制计算

二进制的引入 十进制规则:满10进1&#xff0c;由数字0到9组成。 而所谓十六进制&#xff0c;八进制&#xff0c;二进制的规则也是类似。 这里为了区分十六进制和八进制&#xff0c;十六进制前面会加上0x&#xff0c;八进制前面会加个0作为区分 而二进制的规则类似于十进制&…

PLC协议转BACnet网关BA107

随着通讯技术和控制技术的发展&#xff0c;为了实现楼宇的高效、智能化管理&#xff0c;集中监控管理已成为楼宇智能管理发展的必然趋势。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中…

精品基于Uniapp+springboot智能家居环境检测App

《[含文档PPT源码等]精品基于Uniappspringboot智能家居环境检测App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm …

HTTP3/QUIC 性能测试与配套组件

背景 最近一年很多关于QUIC的文章层出&#xff0c;但是发现一个问题&#xff0c;这些文章都是在介绍QUIC或HTTP3是怎样的一个东西&#xff0c;以及它的优点和机制&#xff0c;将它夸的近乎上天了。然而有心的人估计会亲手做一些测试&#xff0c;就会发现这个被捧上天的东西性能…

宝塔+nextcloud+docker+Onlyoffice 全开启https

折腾了我三天的经验分享 1.宝塔创建网站 nextcloud版本为28.0.1 php8.2 &#xff0c;导入nextcloud绑定域名对应的证书 &#xff0c;不用创建mysql 因为nextcloud 要求是mariadb:10.7 宝塔里没有&#xff0c;就用docker安装一个 端口设置为3307 将数据库文件映射出来/ww…

Leetcode刷题(二十八)

找出字符串中第一个匹配项的下标&#xff08;Easy&#xff09; 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返…