java程序语言设计-反射加设计模式

news/2024/12/18 19:14:38/

第六章:反射+设计模式 一、反射
1. 反射(Reflection):允许在程序运行状态中,可以获取任意类中的属性和方法,并且可以操作任意对象内部的属 性和方法,这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。
2. 类对象 和 类的对象(实例)
 (1) 类的对象(实例):基于某个类 new 出来的对象,也称为实例对象。
(2) 类对象:类加载的产物,封装了一个类的所有信息(包、类名、父类、接口、属性、方法、构造方法等)
 package testio2;
import java.io.*;
public class TestInputStreamReader {
    public static void main(String[] args)  {
        BufferedReader br = null;
        try {
// 1. 创建文件字节输入流对象(基础流) ->不能更改文件编码格式(GBK) FileInputStream fis = new FileInputStream("file/m.txt"); // 2. 创建桥转换流,指定编解码格式为 "GBK"
InputStreamReader isr = new InputStreamReader(fis, "GBK"); // 3. 包装过滤流:增强读操作
br = new BufferedReader(isr); // 4. 读操作
while (true) {
                String s = br.readLine();
                if (s == null) break;
                System.out.println(s);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
if(br!=null){ // 5. 关闭流
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
} }
} }
}
 
 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/news/1556185.html

相关文章

Crawl4AI:一个为大型语言模型(LLM)和AI应用设计的网页爬虫和数据提取工具实战

这里写目录标题 一、crawl4AI功能及简介1、简介2、特性 二、项目地址三、环境安装四、大模型申请五、代码示例1.生成markdown2.结构化数据 一、crawl4AI功能及简介 1、简介 Crawl4AI 是一个开源的网页爬虫和数据抓取工具,一个python项目,主要为大型语言…

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了,直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀,比如我定义为 .mp4 下…

YOLO系列,从V1~V10,持续更新(Pytorch实现)

关于YOLOV1 本文主要偏向代码实战,详细的算法原理着墨不多 主要创新: 实现了实时的目标检测 附上YOLOV1论文地址: https://arxiv.org/abs/1506.02640 关于数据 首先要了解该网络架构的输入和输出,以及网络是如何进行训练的。这里…

workman服务端开发模式-应用开发-gateway的onWebSocketConnect开发

一、onWebSocketConnect安全开发一 为什么叫安全开发一,是因为还有两种情况没有考虑好,需要实测中进行修改。第一种情况:个人如果打开两个窗口,访问同一个系统或个人如果打开两种浏览器,两个窗口同时访问一个系统&…

gpu硬件架构

1.简介 NVIDIA在视觉计算和人工智能(AI)领域处于领先地位;其旗舰GPU已成为解决包括高性能计算和人工智能在内的各个领域复杂计算挑战所不可或缺的。虽然它们的规格经常被讨论,但很难掌握各种组件的清晰完整的图景。 这些GPU的高性…

多线程----互斥

以下是关于多线程中互斥相关的详细知识点介绍以及C语言代码示例: 一、互斥的概念与重要性 在多线程编程中,多个线程可能会同时访问和操作共享资源(如全局变量、共享的数据结构等)。如果没有适当的控制机制,就可能导致…

Java 系统稳定性进阶之路:策略、实践与优化

前言 最近在做系统的稳定性治理,有一点心得和感悟,分享、记录和输出一下,走几步要回头看看,沉淀一下。 稳定性建设-八股文 H-热点(Hotkey)R-限流(RateLimiter)A-授权(Authorize)B-隔离(BulkHead)C-熔断(CircuitBreaker)(服务熔…

RK3588平台上YOLOv8模型转换与CentOS 7.8 Docker镜像拉取超时问题解决指南

RK3588平台上YOLOv8模型转换与CentOS 7.8 Docker镜像拉取超时问题解决指南 一、RK3588平台上YOLOv8模型从PT转换为RKNN 背景介绍 YOLOv8的原生模型包含了后处理步骤,其中一些形状超出了RK3588的矩阵计算限制,因此需要对输出层进行一些裁剪。本文将详细…