做网站的绿色背景图/公司网络营销策略

做网站的绿色背景图,公司网络营销策略,做网站静态和动态,武汉做网站哪家公司好反射 在Java中,反射(Reflection) 是一种强大的机制,允许程序在运行时检查和操作类、方法、字段等信息。通过反射,可以动态地创建对象、调用方法、访问字段,甚至修改私有成员。反射的核心类是 java.lang.re…

反射

在Java中,反射(Reflection) 是一种强大的机制,允许程序在运行时检查和操作类、方法、字段等信息。通过反射,可以动态地创建对象、调用方法、访问字段,甚至修改私有成员。反射的核心类是 java.lang.reflect 包中的 ClassMethodFieldConstructor 等。

反射的常见用法

以下是反射的常见用法

1. 获取 Class 对象

Class 对象是反射的核心,表示一个类或接口的元数据。可以通过以下方式获取 Class 对象:

// 1. 通过类名获取
Class<?> clazz = Class.forName("java.lang.String");// 2. 通过对象获取
String str = "Hello";
Class<?> clazz = str.getClass();// 3. 通过类字面量获取
Class<?> clazz = String.class;

2. 创建对象

通过反射可以动态创建类的实例:

Class<?> clazz = Class.forName("java.lang.String");
// 使用无参构造函数创建对象
Object obj = clazz.getDeclaredConstructor().newInstance();

 如果构造函数有参数,可以这样:

Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
Object obj = constructor.newInstance("Hello, Reflection!");

3. 调用方法

通过反射可以动态调用方法:

Class<?> clazz = Class.forName("java.lang.String");
Object obj = clazz.getDeclaredConstructor().newInstance();// 获取方法对象
Method method = clazz.getMethod("substring", int.class, int.class);// 调用方法
String result = (String) method.invoke(obj, 0, 5);
System.out.println(result); // 输出子字符串

4. 访问字段

通过反射可以访问和修改字段的值:

class MyClass {private String name = "Reflection";
}Class<?> clazz = MyClass.class;
Object obj = clazz.getDeclaredConstructor().newInstance();// 获取字段对象
Field field = clazz.getDeclaredField("name");// 设置字段可访问(即使是私有字段)
field.setAccessible(true);// 获取字段值
String nameValue = (String) field.get(obj);
System.out.println(nameValue); // 输出: Reflection// 修改字段值
field.set(obj, "New Value");
System.out.println(field.get(obj)); // 输出: New Value

5. 访问私有成员

通过 setAccessible(true) 可以绕过访问控制,访问私有成员(字段、方法、构造函数):

class MyClass {private void privateMethod() {System.out.println("Private Method Called!");}
}Class<?> clazz = MyClass.class;
Object obj = clazz.getDeclaredConstructor().newInstance();// 获取私有方法
Method method = clazz.getDeclaredMethod("privateMethod");// 设置方法可访问
method.setAccessible(true);// 调用私有方法
method.invoke(obj); // 输出: Private Method Called!

反射的优缺点

优点:

  • 动态性:可以在运行时动态加载类、调用方法、访问字段。

  • 灵活性:适用于框架和库的开发(如 Spring、Hibernate)。

缺点:

  • 性能开销:反射操作比直接调用慢。

  • 安全性问题:可以绕过访问控制,破坏封装性。

  • 代码可读性差:反射代码通常难以理解和维护。


反射的使用场景

  • 框架开发:如 Spring 的依赖注入、Hibernate 的 ORM 映射。

  • 动态代理:如 JDK 动态代理。

  • 工具类:如 JSON 库(Gson、Jackson)的序列化和反序列化。


反射示例代码

以下是一个完整的反射示例:

import java.lang.reflect.*;public class ReflectionExample {public static void main(String[] args) throws Exception {// 获取 Class 对象Class<?> clazz = Class.forName("java.lang.String");// 创建对象Object obj = clazz.getDeclaredConstructor(String.class).newInstance("Hello, Reflection!");// 调用方法Method method = clazz.getMethod("substring", int.class, int.class);String result = (String) method.invoke(obj, 0, 5);System.out.println(result); // 输出: Hello// 访问字段(假设有一个私有字段)Field field = clazz.getDeclaredField("value");field.setAccessible(true);byte[] value = (byte[]) field.get(obj);System.out.println(new String(value)); // 输出: Hello, Reflection!}
}

 通过反射,Java 提供了强大的动态能力,但应谨慎使用,避免滥用导致性能问题和代码复杂性。

静态vs动态语言


动态语言
    是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,
    已有的函数可以被删除或是其他结构上的变化。通俗说就是在运行时代码可以根据某些条件改变自身结构
    主要动态语言:Object-C、C#、Javascript、PHP、Python等。
静态语言
    与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++
    Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制获得
    类似动态语言的特性。Java的动态性让编程的时候更加灵活!

笔记

Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,
并能直接操作任意对象的内部属性及方法
    语法: Class c = Class.forName("java.lang.String")
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就
包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,
所以,我们形象的称之为:反射
    正常方式:引入需要的“包类”名称 --》 通过new实例化 --》取得实例化对象
    反射方式:实例化对象 --》getClass()方法 --》 得到完整的“包类”名称

Java反射机制提供的功能
    在运行时判断任意一个对象所属的类
    在运行时构造任意一个类的对象
    在运行时判断任意一个类所具有的成员变量和方法
    在运行时获取泛型信息
    在运行时调用任意一个对象的成员变量和方法
    在运行时处理注解
    生成动态代理
    ....

优点:实现动态创建对象和编译,体现出很大的灵活性

缺点:对性能有影响。使用反射基本上是一直解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。
这类操作总是慢于 直接执行相同的操作

反射相关的主要API
java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Filed:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器
...

Class类


在Object类中定义了以下的方法,此方法将被所有子类继承
    public final Class getClass()
    这个方法的返回值的类型是一个Class类,此类是Java反射的源头
    实际上所谓反射从程序的运行结果看也很好理解,即:可以通过对象反射求出类的名称

对象照镜子后可以得到的信息,某个类的属性,方法,和构造器,某个类到底实现了哪些接口
对于每个类而言,JRE都为其保留一个不变的Class类型的对象,一个Class对象包含了特定某个
结构(class/interface/enum/annotation/primitive type/void/[])的有关信息

Class本身也是一个类
Class对象只能由系统建立对象
一个加载的类在JVM中只会有一个Class实例
一个Class对象对应的是一个加载到JVM中的一个.class文件
每个类的实例都会记得自己是由哪个Class实例所生成
通过Class可以完整地得到一个类中的所有被加载的结构
Class类是Reflection的根源,针对任何你想动态加载,运行的类,唯有先获得相应的Class对象

Class类的常用方法
static ClassforName(String name)  返回指定类名name的Class对象
Object newInstance()              调用缺省构造函数,返回Class对象的一个实例
getName()                         返回此Class对象所表示的实体(类,接口,数组类或void)的名称
Class getSuperClass()             返回当前Class对象的父类的Class对象
Class[] getinterface()            获取当前Class对象的接口
ClassLoader getClassLoader()      返回该类的类加载器
Constructor[] getConstructors()   返回一个包含某些Constructor对象的数组
Method getMethod(String name,Class..T)  返回一个Method对象,此对象的形参类型为paramType
Field[] getDeclaredFields()       返回Field对象的一个数组

 

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

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

相关文章

图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF

将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中&#xff0c;我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题&#xff1a; Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…

【测试】⽤例篇

本节重点⽬标 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 基于需求的设计⽅法 具体的设计⽅法 等价类 边界值 判定表法 正交法 场景法 错误猜测法 1. 测试⽤例 1.1 概念 什么是测试⽤例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为…

C++17中std::chrono::duration和std::chrono::time_point的舍入函数

文章目录 1. std::chrono::duration的舍入函数1.1 floor1.2 ceil1.3 round 2. std::chrono::time_point的舍入函数2.1 示例 3. 舍入函数的应用场景3.1 时间测量3.2 数据记录3.3 时间同步 4. 总结 在C17中&#xff0c; std::chrono库提供了一组强大的时间处理工具&#xff0c;包…

linux之perf(17)PMU事件采集脚本

Linux之perf(17)PMU事件采集脚本 Author: Once Day Date: 2025年2月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Perf性能分析_Once_day的博…

兰州百合基因组(36.68 Gb)-文献精读113

The evolutionary tale of lilies: Giant genomes derived from transposon insertions and polyploidization 百合的进化故事&#xff1a;由转座子插入和多倍化导致的巨型基因组 百合&#xff08;Lilium spp.&#xff09;&#xff0c;被誉为“球根花卉之王”&#xff0c;因其…

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end

UE5.3 C++ TArray系列(一)

一.TArray概述 它们就相当于C动态数组Vector&#xff0c;但是被UE封装了&#xff0c;懂得都懂反射嘛&#xff0c;要不一不小心就被回收了。 它真的非常常见&#xff0c;我所用的容器中&#xff0c;它绝对排名第一&#xff0c;第二是TMap。 同类好理解&#xff0c;我平时也常用…

Docker+Dify部署DeepSeek-r1本地知识库

安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…

MySQL数据库——表的约束

1.空属性&#xff08;null/not null&#xff09; 两个值&#xff1a;null&#xff08;默认的&#xff09;和not null&#xff08;不为空&#xff09; 数据库默认字段基本都是字段为空&#xff0c;但是实际开发时&#xff0c;尽可能保证字段不为空&#xff0c;因为数据为空没办法…

腿足机器人之十一- 深度强化学习

腿足机器人之十一- 深度强化学习 机器人能力腿足机器人RL问题建模强化学习解决方案 强化学习算法库选择建议 深度学习技术已经在语音、图像、视频、文本等领域应用广泛&#xff0c;其和强化学习的结合使得基于深度学习的大模型能力更是上升一个台阶。因而用在腿足机器人的运动中…

Redisson分布式锁java语法, 可重入性实现原理 ,(还有可重试性,超时不释放,主从一致性)

Redisson在java的使用方法 Redisson分布式锁不可重入的实现原理 设置一个HSET key为锁的名字&#xff0c;field为当前获取锁的线程名字&#xff0c;value为可重入锁的当前已经重入次数 追踪源码发现RedissonClient类的tryLock就是用lua脚本和上图逻辑实现的加锁解锁&#xf…

YOLOv8与DAttention机制的融合:复杂场景下目标检测性能的增强

文章目录 1. YOLOv8简介2. DAttention (DAT)注意力机制概述2.1 DAttention机制的工作原理 3. YOLOv8与DAttention (DAT)的结合3.1 引入DAT的动机3.2 集成方法3.3 代码实现 4. 实验与结果分析4.1 实验设置4.2 结果分析推理速度性能对比 5. 深度分析&#xff1a;DAttention在YOLO…

MAC快速本地部署Deepseek (win也可以)

MAC快速本地部署Deepseek (win也可以) 下载安装ollama 地址: https://ollama.com/ Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;本地运行框架&#xff0c;旨在简化大模型的部署和管理流程&#xff0c;使开发者、研究人员及爱好者能够高效地在本地环境中实验和…

springboot+dubbo+zookeeper的注册服务和调用实践

目录 zookeeper为什么可作为注册中心zookeeper注册中心优缺点启动zookeeper编写springboot项目提供dubbo服务1. 服务接口2. Springboot引入dubbo实现服务接口2.1 工程目录和依赖2.2 启动程序和application.properties2.3 DubboService 实现服务接口2.4 测试api&#xff0c;用于…

Missing required prop: “maxlength“

背景&#xff1a; 封装一个使用功能相同使用频率较高的input公共组件作为子组件&#xff0c;大多数长度要求为200&#xff0c;且实时显示统计子数&#xff0c;部分input有输入提示。 代码实现如下&#xff1a; <template><el-input v-model"inputValue" t…

TCP...

什么是TCP&#xff1f; TCP是面向连接的、可靠的、基于字节流的传输层通信协议 面向连接&#xff1a;一定是「一对一」才能连接&#xff0c;不能像 UDP 协议可以一个主机同时向多个主机发送消息&#xff0c;也就是一对多&#xff0c;是无法做到的&#xff1b;字节流&#xff…

react+typescript,初始化与项目配置

1&#xff0c;创建项目 npx create-react-app music --template typescript 2&#xff0c;配置项目别名 npm install craco/cracoalpha -D 1&#xff0c;最外层与src平级创建 craco.config.jsconst path require(path)const resolve (dir) > path.resolve(__dirname, d…

linux 安装启动zookeeper全过程及遇到的坑

1、下载安装zookeeper 参考文章&#xff1a;https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法&#xff1a;参考&#xf…

网络安全中的机器学习

当涉及到网络安全时&#xff0c;技术一直是保护系统免受攻击和数据泄露的关键。在这篇论文中&#xff0c;我将介绍一些当前在网络安全领域使用的关键技术&#xff0c;包括加密&#xff0c;身份验证和防火墙。 首先&#xff0c;加密是网络安全中最常见的技术之一。加密是指使用算…

windows上vscode cmake工程搭建

安装vscode插件&#xff1a; 1.按装fastc&#xff08;主要是安装MinGW\mingw64比较方便&#xff09; 2.安装C&#xff0c;cmake&#xff0c;cmake tools插件 3.准备工作完成之后&#xff0c;按F1&#xff0c;选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…