当前位置: 首页 > ops >正文

java------------反射

一般程序是通过main方法开始执行

但servlet是通过反射来执行的

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

方法/变量/构造器/继承和实现的接口------->统称类信息

通过反射获取类信息

1.使用反射就必须生成类对象

java文件执行过程:

<1>创建一个xxx.java文件--------通过java命令------->转译成xxxx.class文件

<2>加载成类对象

<3>类对象再放入内存执行

此时,变量、方法、构造器都存储在类对象里

   生成类对象的三种方式(对应三个阶段)

(1)class.forName("全类名")                            对应<1>

         PS:全类名=包名+类名;

                  xxxx.class文件,就是二进制编码文件

(2) 类名.class                                                 对应<2>

(3)对象名.getClass()                                      对应<3>

2.获取类信息
   类信息存储方式一般有两种:

(1)获取相关集合

如:Field[] fields =clas.getDeclaredFields();

(2)直接获取(一般根据名称来获取)

<1>获取变量

常用四种方法:

获取相关集合:

getDeclaredFields和getFields,前者可以无视修饰符获取全部内容,后者只能获取public修饰符修饰的数据

直接获取:

getDeclaredField和getField,差别同上

如:Field[] fields =clas.getDeclaredFields();                                    获取集合

       Field ageFiled =clas.getDeclaredField("age");                          直接获取

       Field nameFiled =clas.getDeclaredField("name");                    直接获取

而使用getFields和getDeclaredField方法时,与之相同,如:Field[] fields1 =clas.getFields();

<2>根据方法名获取方法


程序区分方法的方式来源于方法的签名
方法的签名=方法名称+参数列表

常用四种:

获取相关集合:

getDeclaredMethods和getMethods,二者差别同上

但getMethods在获取非public修饰的信息时可能会获取到同类型的Object方法

直接获取:

getDeclaredField和getField,差别同上

使用方法:getDeclaredMethod("方法名",参数类型.class)

.class便于反射

若方法没有参数,则直接getDeclaredMethods("方法名")

<3>获取构造器

常用四种方法:

获取相关集合:

getDeclaredConstructors和getConstructors,二者差别同上

直接获取:

getDeclaredConstructor和getConstructor,差别同上

使用方法:如getDeclaredConstructor(参数类型.class)

<4>获取接口/父类

获取当前接口/本身实现了多个接口

常用方法:getInterfaces()

注:

1、接口/类都需要用当前的类对象形式来进行接收,如:

       Class clas =Class.forName("com.Cat");
        
        Class[] classes =clas.getInterfaces()

1、获取接口中不存在getDeclaredInterfaces()方法,因为接口中不存在非public修饰的情况

2、大多数接口/继承的类都是public类型的,私有的类本身也无法被继承,同理,私有的接口本身也无法存在

对获取的类信息的使用

类里面存在一个默认的不显示的无参构造器

当类中有自定义有参构造器时,对应默认构造器被覆盖

获取该构造器时必须用含Declared的方法

获取private修饰的构造器时用含Declared的方法,但使用时必须暴力反射才能使用

暴力反射:类名.setAccessible(true)

被private修饰的数据的使用,都要提前暴力反射

变量的使用

set用于赋值,set(Object,value)

Object提供内存空间,该处写变量所在的类,value就是变量的值

get用于取值,使用方法:变量名.get(类名)

构造器用来创造对象,赋值时要对构造器强制转换到相应类型

方法的使用

方法的赋值使用invoke执行,使用方法与变量的方法相同

http://www.xdnf.cn/news/4970.html

相关文章:

  • JAVA,大花猫大黑狗例题
  • 敦普水性无铬锌铝涂层:汽车紧固件防锈15年,解决螺栓氢脆腐蚀双痛点
  • linux中的日志分割
  • sklearn自定义pipeline的数据处理
  • c++中new和malloc 分配内存有什么不同
  • VSCode远程无法选择虚拟环境问题
  • 官方SDK停更后的选择:开源维护的Bugly Unity SDK
  • 《深挖Java中的对象生命周期与垃圾回收机制》
  • 麒麟系统安装 Nginx 作为非 Web 程序的完整指南
  • 自定义prometheus exporter实现监控阿里云RDS
  • 【彻底卸载nginx并部署nginx1.22.1+ssl模块等】
  • 供应链管理系统建设方案,技术方案(Word)
  • SpringAI--基于MySQL的持久化对话记忆实现
  • 当当网Top500书籍信息爬取与分析
  • 事务失效的场景
  • 循环卷积(Circular Convolutions)
  • 227. 基本计算器 II
  • Tomcat 日志体系深度解析:从访问日志配置到错误日志分析的全链路指南
  • VUE2课程计划表练习
  • 推送到Gerrit时报错,缺少Change-Id
  • component :is是什么?
  • 多轴钻孔组合机床设计与关键技术研究
  • 【nestjs】一般学习路线
  • 嵌入式学习笔记 - 关于单片机的位数
  • 基于AQS实现Reentrantlcok
  • 【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题
  • LeetCode百题刷002摩尔投票法
  • 镜头内常见的马达类型(私人笔记)
  • Nginx静态资源增加权限验证
  • CurrentHashMap的整体系统介绍及Java内存模型(JVM)介绍