java反射API

反射

  • 什么是Java的动态机制
  • 什么是反射机制
  • 什么是Class类
    • Class提供了诸多的get方法
  • 反射机制实例化对象
    • Class提供了一个方法
  • Constructor类
    • 指定构造器实例化对象
  • Method类
    • 获取一个类中的所有方法
      • Class类提供了对应的方法
    • 获取本类自定义的所有方法
      • Class类提供了对应的方法
    • 获取表示的方法中的相关信息
      • Class类提供了对应的方法
    • 利用反射机制调用方法
      • Class类提供了对应的方法
    • 暴力反射
      • 反射机制访问类的私有成员的方法
    • 反射机制操作属性
      • Class类提供了对应的方法
    • 通过类对象获取类加载路径和当前类路径
      • Class类提供了对应的方法

什么是Java的动态机制

什么是反射机制

反射是java的动态机制,允许程序在[运行期间]再确定对象实例化,方法调用,属性操作等
反射可以提高代码的灵活度和可扩展性,但是运行效率较慢,开销较大,避免过度使用

什么是Class类

  • java.lang.Class类是Java反射机制的基础
  • Class的每一个实例用于表示JVM中加载的一个类
  • JVM中每个被加载的类都有且只有一个Class的实例
  • Class类的构造器是私有的,开发者不能主动实例化Class类的对象
  • Class类的对象仅能由JVM创建

类对象:
Class类的实例

  • JVM加载一个类的字节码文件同时会实例化一个Class的实例用来记录加载的类的信息.
    那么这个Class的实例就可以反映出加载的类的相关信息(类名,包信息,构造器,方法,属性等)
    从而在程序运行期间供我们了解一个类的内容以便进行操作.

  • 在JVM内部,每个被加载的类都有且只有一个Class的实例.

  • 反射的第一步是获取一个类的类对象(Class的实例)

获取方式一:

  • 类名.class
    例如:
    Class c1 = String.class;//获取String的类对象
    Class c2 = int.class;//获取int(基本类型)的类对象.
    注意:基本类型获取类对象只有这一种方式

获取方式二:

  • Class.forName(String className)
    通过指定一个类的完全限定名来获取一个类的类对象
    例如:
    Class c1 = Class.forName(“java.lang.String”);
    Class c2 = Class.forName(“java.util.ArrayList”);

Class提供了诸多的get方法

用于获取其表示的类的相关信息

  • getName()
  • getSimpleName()
  • getPackage()
  • getPackage().getName()

反射机制实例化对象

Class提供了一个方法

  • Object newInstance()
    类必须有一个无参数的构造器,否则就需要传入构造器对应的参数
    类的构造器的访问权限需要足够,通常设置为public
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {Person person = new Person();System.out.println(person);Class cls = Class.forName("reflect.Person");System.out.println(cls.newInstance());Scanner scanner = new Scanner(System.in);System.out.println("请输入类名");Class clsName = Class.forName(scanner.nextLine());System.out.println(clsName.newInstance());}

Constructor类

  • Constructor类是反射对象之一,它的每一个实例用于表示一个构造器
  • 使用无参构造器,等效与Class中的newInstance()
    如果构造器抛出特定异常此方式可对应抛出该异常

指定构造器实例化对象

public class Person {private String name = "张三";private int age = 22;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
public static void main(String[] args) throws InvocationTargetException, 
InstantiationException, IllegalAccessException, NoSuchMethodException, 
ClassNotFoundException {Person person = new Person("李四",22);System.out.println(person);Class cls = Class.forName("reflect.Person");Constructor constructor = cls.getConstructor(String.class,int.class);System.out.println(constructor.newInstance("王五",36));Constructor constructor1 = cls.getConstructor();System.out.println(constructor1.newInstance());}

Method类

Method类是反射对象之一,它的每一个实例用于表示一个方法
通过Method对象我们可以得知该方法的相关信息(方法名,参数列表,返回值,访问修饰符等)
还可以通过Method对象调用该方法

获取一个类中的所有方法

Class类提供了对应的方法

  • Method[] getMethods()
public class Person {private String name = "张三";private int age = 22;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}public void sayHello(){System.out.println();}public void sayHi(){System.out.println();}public void doSome(){System.out.println();}public void sleep(){System.out.println();}public void watchTV(){System.out.println();}public void study(){System.out.println();}public void playGame(){System.out.println();}public void sing(){System.out.println();}public void say(String info){System.out.println(name+":"+info);}public void say(String info,int count){for (int i=0;i<count;i++){System.out.println(name+":"+info);}}private void hehe(){System.out.println("我是Person的私有方法hehe!!");}
}
public static void main(String[] args) throws ClassNotFoundException {Scanner scanner = new Scanner(System.in);Class cls = Class.forName(scanner.nextLine());Method[] methods = cls.getMethods();System.out.println("一共:" +methods.length+ "个方法");for(Method method : methods){System.out.println(method.getName());}}

获取本类自定义的所有方法

Class类提供了对应的方法

  • Method[] getDeclaredMethods()
    不含超类继承的方法
public static void main(String[] args) throws ClassNotFoundException {Class cls = Class.forName("reflect.Person");Method[] methods = cls.getDeclaredMethods();for(Method method : methods){System.out.println(method.getName());}}

请添加图片描述

获取表示的方法中的相关信息

Class类提供了对应的方法

  • getDeclaredMethod(String)
  • getDeclaredMethod(String, in)
    获取有参方法时,getDeclaredMethod的第一个参数为方法名,从第二个参数开始为获取方法的参数列表
  • getParameterCount()
    获取当前方法的参数个数
  • getModifiers()
    获取当前方法的访问修饰符
    Method对象表示一个方法,其提供了一组可以获取表示的方法中的相关信息
public static void main(String[] args) throws NoSuchMethodException, 
ClassNotFoundException {Class cls = Class.forName("reflect.Person");Method method = cls.getDeclaredMethod("say", String.class, int.class);System.out.println("方法名" +method.getName());System.out.println("参数个数" +method.getParameterCount());switch (method.getModifiers()){case Modifier.PUBLIC:System.out.println("是一个公开方法");break;case Modifier.PRIVATE:System.out.println("是一个私有方法");break;case Modifier.PROTECTED:System.out.println("是一个受保护方法");}}

利用反射机制调用方法

Class类提供了对应的方法

  • Object invoke(Object obj)
    无参调用
public static void main(String[] args) throws NoSuchMethodException, 
ClassNotFoundException, InstantiationException, IllegalAccessException, 
InvocationTargetException {Class cls = Class.forName("reflect.Person");Object obj = cls.newInstance();Method method = cls.getDeclaredMethod("doSome");method.invoke(obj);}
  • Object invoke(Object obj, Object…… args)
    确保传递给invoke方法的参数列表与所调用的方法的参数列表相匹配
    否则,将会抛出异常
public static void main(String[] args) throws Exception {Class cls = Class.forName("reflect.Person");Object obj = cls.newInstance();Method method = cls.getDeclaredMethod("say",String.class);method.invoke(obj, "hello");Method method1 = cls.getDeclaredMethod("say",String.class,int.class);method1.invoke(obj, "大家好",5);}

暴力反射

反射机制访问类的私有成员的方法

  • setAccessible(true)
    强行打开访问权限,访问私有方法
  • setAccessible(false)
    使用后,关闭私有成员的访问权限
public static void main(String[] args) throws Exception {Class cls = Class.forName("reflect.Person");Method method = cls.getDeclaredMethod("hehe");method.setAccessible(true);method.invoke(cls.newInstance());method.setAccessible(false);}

反射机制操作属性

Class类提供了对应的方法

  • Field getDeclaredField(String name)
    允许访问类的声明字段
    返回一个Field对象,表示指定类或接口声明的指定公共、受保护、默认(包)访问或私有字段
  • void set(Object obj, Object value)
    Field类的一个方法,obj是包含该字段的对象,value是要设置的新值
  • native Object get(Object obj)
public class Teacher {public String name;@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +'}';}
}
public static void main(String[] args) throws ClassNotFoundException, 
InstantiationException, IllegalAccessException, NoSuchFieldException {Class cls = Class.forName("reflect.Teacher");Object object = cls.newInstance();cls.getDeclaredField("name").set(object, "Bloom");System.out.println(object);}

通过类对象获取类加载路径和当前类路径

Class类提供了对应的方法

  • getClassLoader()
    返回该类的类加载器,它是用来加载类文件的对象
  • getResource(“.”)
    获取资源路径的方法,它从当前类的类加载器中查找资源
    "."代表当前目录,这表示获取当前目录下的所有资源
  • toURI()
    将路径转换为统一资源标识符(URI),它可以唯一地识别任何资源,包括网络资源、文件系统资源等
public class ReflectDemo {public static void main(String[] args) throws URISyntaxException {File baseDir = new File(//获取当前类的类加载器中的当前目录的资源路径,并将其转换为URIReflectDemo.class.getClassLoader().getResource(".").toURI());System.out.println(baseDir);File dir = new File(//获取当前类的类加载器中的当前目录的资源路径,并将其转换为URIReflectDemo.class.getResource(".").toURI());System.out.println(dir);}
}

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

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

相关文章

RabbitMQ 运维 扩展

1、集群管理与配置 1.1、集群搭建 关于Rabbitmq 集群的搭建&#xff0c;详见以下文章。简单说来就是将多个单机rabbitmq服务&#xff0c;通过给到一致的密钥&#xff08;.erlang.cookie&#xff09;并且开放rabbitmq服务的 25672 端口&#xff0c;允许多节点间进行互相通讯&am…

基于单片机设计的太阳能跟踪器

一、前言 随着对可再生能源的需求不断增长&#xff0c;太阳能作为一种清洁、可持续的能源形式&#xff0c;受到越来越多的关注和应用。太阳能光板通常固定在一个固定的角度上&#xff0c;这限制了它们对太阳光的接收效率。为了充分利用太阳能资源&#xff0c;提高太阳能光板的…

【ChatGPT从瀑布模式到水母模式】如何赋能软件研发全流程?

【文末送书】今天推荐一本强大工具书《ChatGPT 驱动软件开发&#xff1a;AI 在软件研发全流程中的革新与实践》&#xff0c;本文将从其亮点与结构出发&#xff0c;详细阐发其对于运维、项目经理、程序员等的重要性与益处。 文章目录 导语内容作者简介专家推荐读者对象直播预告文…

怎样解决“缺失msvcp110.dll”错误,msvcp110.dll的修复教程

在计算机使用过程中&#xff0c;我们可能会遇到一些系统错误提示&#xff0c;比如“msvcp110.dll文件丢失”。这是因为msvcp110.dll是Microsoft Visual C 2012的一个动态链接库文件&#xff0c;如果这个文件丢失或者损坏&#xff0c;就可能导致某些程序无法正常运行。那么&…

(四)docker:为mysql和java jar运行环境创建同一网络,容器互联

看了很多资料&#xff0c;说做互联的一个原因是容器内ip不固定&#xff0c;关掉重启后如果有别的容器启动&#xff0c;之前的ip会被占用&#xff0c;所以做互联创建一个网络&#xff0c;让几个容器处于同一个网络&#xff0c;就可以互联还不受关闭再启动ip会改变的影响&#xf…

C++标准模板(STL)- 类型支持 (类型属性,is_volatile,is_trivial,is_const)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)

大纲 Tumbling Count WindowsmapreduceWindow Size为2Window Size为3Window Size为4Window Size为5Window Size为6 完整代码参考资料 之前的案例中&#xff0c;我们的Source都是确定内容的数据。而Flink是可以处理流式&#xff08;Streaming&#xff09;数据的&#xff0c;就是…

零信任网络:一种全新的网络安全架构

随着网络技术的不断发展&#xff0c;网络安全问题日益凸显。传统的网络安全策略往往基于信任和验证&#xff0c;但这种信任策略存在一定的局限性。为了解决这一问题&#xff0c;零信任网络作为一种全新的网络安全架构&#xff0c;逐渐受到人们的关注。本文将对零信任网络的概念…

qt 系列(二)---qt designer通过设置控件样式表进行背景颜色设置

1. 前言 一般Layouts不可以进行改变样式表&#xff0c;当我们想修改背景样式表&#xff0c;同时又不改变其他控件的颜色时&#xff0c;可以选择List View 控件改变背景颜色。 2. 设置背景 &#xff08;1&#xff09;配置 .qrc 文件 新建mypicture.qrc文件&#xff0c;记事本打…

虚拟机部署与发布J2EE项目(Linux版本)

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.jdk安装配置 打开虚拟机 Centos 登入账号&#xff0c;并且使用MobaXterm进行连接 1.1. 传入资源 连接…

Linux启动故障排错

Linux启动过程 开机流程、模块管理-CSDN博客 Grub三个阶段 1st stage&#xff1a;执行Grub主程序。Grub安装在MBR。由于MBR太小&#xff0c;所以与配置文件分开放1.5 stage&#xff1a;识别不同的文件系统2nd stage&#xff1a;加载Grub配置文件 /boot/grub2/grub.cfg。配置…

RISC-V IDE MRS无感远程协助模块详解

RISC-V IDE MRS无感远程协助模块详解 一、说明 1.1 概述 针对RISC-V/ARM等内核MCU的嵌入式集成开发环境MRS(MounRiver Studio)从V1.90版本开始内置无感远程协助模块&#xff08;Sensorless Remote Assistant Module&#xff0c;以下简称SRA模块&#xff09;。SRA模块是一款支…

《研发效能(DevOps)工程师》课程简介(一)丨IDCF

为贯彻落实《关于深化人才发展体制机制改革的意见》&#xff0c;推动实施人才强国战略&#xff0c;促进专业技术人员提升职业素养、补充新知识新技能&#xff0c;实现人力资源深度开发&#xff0c;推动经济社会全面发展&#xff0c;根据《中华人民共和国劳动法》有关规定&#…

AI技术发展:防范AI诈骗,守护数字安全

随着AI技术的迅猛发展&#xff0c;人工智能赋予了计算机更多的能力&#xff0c;包括自然语言处理、图像生成、声音合成等。这些领域的突破为人们提供了全新的体验和便捷&#xff0c;但同时也催生了一些潜在的安全风险&#xff0c;其中最突出的就是AI诈骗。本文将探讨如何防范AI…

入栏需看——管理类联考——英语——知识+记忆篇——导航页

文章目录 Section I Use of English——完型填空Section II Reading ComprehensionPart A——阅读理解 A 节&#xff08;Part A&#xff09;&#xff08;四篇&#xff09;Part B——阅读理解 B 节&#xff08;Part B&#xff09;&#xff08;只有一篇&#xff09;Part C——翻译…

vue基于ElementUI/Plus自定义的一些组件

vue3-my-ElementPlus 源码请到GitHub下载使用MyTable、MySelect、MyPagination 置顶|Top | 使用案例&#xff1a; 1.0 定义表格数据&#xff08;测试使用&#xff09; data() {return {tableData: [],value:[],valueList: [],}; },// 构造表格测试数据// 1 第一行&#xf…

成集云 | 英克ERP对接批发销售门店 | 解决方案

方案介绍 批发连锁门店是一种以批发销售为主&#xff0c;通过连锁经营方式进行管理的商业组织形态。它通常由一个总店或总公司负责管理和运营&#xff0c;下面拥有多个分店或加盟店&#xff0c;形成一个连锁经营网络。主要业务是向下游零售商或消费者销售商品&#xff0c;因此…

【NLP】什么是语义搜索以及如何实现 [Python、BERT、Elasticsearch]

语义搜索是一种先进的信息检索技术&#xff0c;旨在通过理解搜索查询和搜索内容的上下文和含义来提高搜索结果的准确性和相关性。与依赖于匹配特定单词或短语的传统基于关键字的搜索不同&#xff0c;语义搜索会考虑查询的意图、上下文和语义。 语义搜索在搜索结果的精度和相关…

AD9371 官方例程HDL JESD204B相关IP端口信号

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

C语言实现 1.在一个二维数组中形成 n 阶矩阵,2.去掉靠边元素,生成新的 n-2 阶矩阵;3.求矩阵主对角线下元素之和:4.以方阵形式输出数组。

矩阵形式&#xff1a; 1 1 1 1 1 2 1 1 1 1 3 2 1 1 1 4 3 2 1 1 5 4 3 2 1 完整代码&#xff1a; /*编写以下函数 1&#xff0e;在一个二维数组中形成如以下形式的 n 阶矩阵&#xff1a; 1 1 1 1 1 2 1 1 1 1 3 2 1 1 1 4 3 2 1 1 5 4 3 2 1 2&#xff0e;去掉…