第六章:反射+设计模式

ops/2024/12/18 15:54:12/

一、反射


1.反射(Reflection):允许在程序运行状态中,可以获取任意类中的属性和方法,并且可以操作任意对象内部的属性和方法,这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。

2.类对象和类的对象(实例)
(1) 类的对象(实例):基于某个类 new 出来的对象,也称为实例对象。
(2) 类对象:类加载的产物,封装了一个类的所有信息(包、类名、父类、接口、属性、方法、构造方法等)

 

  

3. 获取类对象的三种方式:

(1) 通过类的对象,获取类对象
Student s = new Student();
Class c = s.getClass();
(2) 通过类名获取类对象
Class c = 类名 .class;
(3) 通过静态方法获取类对象
Class c=Class.forName(“ 包名 . 类名 ”);
注意:需要 权限类名:包名.类名
public class TestClass {
public static void main(String[] args) throws ClassNotFoundException {
// 深入 JVM 实现原理 / JVM 规范
// 通过反射技术 获取 类对象
Student s = new Student(); // 类的对象,实例
Class c=s.getClass(); // 获取类对象
System.out.println(c);
// 第二种方式:
Class c2=Class.forName("testflect.Student");
System.out.println(c2);
System.out.println(c==c2);
Class c3 = Student.class;
System.out.println(c3);
}
}
4. 反射常见的方法:
Class c = Class.forName("testflect.Student");
// 动态 操作类中信息
System.out.println(c.getName());// 获取类名
System.out.println(c.getPackage().getName());// 获取包名
System.out.println(c.getSuperclass().getName()); // 获取父类
Class[] cs=c.getInterfaces();// 获取 实现的接口
System.out.println(" 实现的接口数量为: "+cs.length);
for(Class inter:cs){
System.out.println(inter.getName());
}
Method[] ms = c.getMethods();// 获取公开方法:自定义 + 父类中
System.out.println("Student 类定义的方法数量为: "+ms.length);
for(Method m:ms){
System.out.println(m.getName());
}
System.out.println("--------------");
Method[] mds = c.getDeclaredMethods();// 获取自定义方法,包含非公开的
System.out.println("Student 类中自定义的方法为: "+mds.length);
for(Method m:mds){
System.out.println(m.getName());
}
System.out.println(" 获取属性: ");
Field[] fs = c.getDeclaredFields();// 获取自定义属性:包含非公开的
for (Field f:fs){
System.out.println(f.getName());
}
通过反射技术获取实例:
// 通过类对象 获取 类的对象
--- 采用无参数的构造方法获取对象
Class c = Class.forName("testflect.Student");
Object obj = c.newInstance();// 默认采用无参数的构造方法

Student s =(Student)obj;
s.setName(" 佳明 ");
s.setAge(28);
s.setScore(99.0);
System.out.println(obj);
-- 采用有参数的构造方法获取对象
System.out.println(" 利用有参数的构造方法获取对象: ");
Constructor con=c.getConstructor(String.class,Integer.class,Double.class);
Object obj2=con.newInstance(" 杨浩 ",37,88.0);
System.out.println(obj2);
// 利用反射技术操作私有化的方法
Method md=c.getDeclaredMethod("test");
md.setAccessible(true);
md.invoke(obj2);

http://www.ppmy.cn/ops/142955.html

相关文章

游戏引擎学习第53天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 现在我们正进行游戏结构的重构,目的是为了更合理地安排游戏的组织方式,模拟玩家周围的实体。我们将这些实体分为两类:一类是当前正在屏幕上显示的实体,另一类是被映射到低频更…

【Pandas】pandas interval_range

Pandas2.2 General Top-level dealing with Interval data 方法描述interval_range([start, end, periods, freq, …])用于生成固定长度的区间序列 pandas.interval_range() pandas.interval_range() 是 Pandas 库中用于生成固定频率的 Interval 对象的函数。这些 Interval…

无管理员权限 LCU auth-token、port 获取(全网首发 go)

一: 提要: 参考项目: https://github.com/Zzaphkiel/Seraphine 想做一个 lol 查战绩的软件,并且满足自己的需求(把混子和大爹都表示出来),做的第一步就是获取 lcu token ,网上清一色…

《探秘开源气味数据库:数字世界里的“气味宝藏”》

《探秘开源气味数据库:数字世界里的“气味宝藏”》 一、开源气味数据库的兴起背景(一)技术发展的推动(二)市场需求的催生 二、常见的开源气味数据库介绍(一)GS-LF 香精香料数据库(二…

AirSim 利用pygame绘制窗口并获取无人机FPV实时图像呈现

利用pygame绘制窗口并获取无人机FPV实时图像呈现的代码如下&#xff1a; import sys import time import airsim import pygame import cv2 import numpy as np# >------>>> pygame settings <<<------< # pygame.init()# 创建 pygame 窗口 screen…

es 3期 第16节-运用启发式特性引导用户查询

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…

机器学习-正则化技术

文章目录 拟合正则化正则项L1 正则化&#xff08;Lasso&#xff09;L2 正则化&#xff08;Ridge&#xff09; 多元线性回归的正则化回归形式代码 拟合 过拟合&#xff1a;参数&#xff08;特征&#xff09;过多&#xff08;理解为考虑很多因素)或者说过多专注于原来的训练数据…

智慧公交指挥中枢,数据可视化 BI 驾驶舱

随着智慧城市的蓬勃发展&#xff0c;公共交通作为城市运营的核心枢纽&#xff0c;正朝着智能化和数据驱动的方向演进。通过整合 CAN 总线技术(Controller Area Network&#xff0c;控制器局域网总线)、车载智能终端、大数据分析及处理等尖端技术&#xff0c;构建的公交“大脑”…