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

反射(一)

动态 VS 静态语言

动态语言:运行时,可以改变其结构。

Object-C、C#、JS、PHP、Python
JS 就是动态语言。

function f() {var x = "var a=3; var b=5; alert(a+b)";eval(x);
}

静态语言:运行时,结构不可变。

Java、C、C++
Java 不是动态语言,但可称为“准动态语言”——反射。

Reflection(反射)

  • 是Java被视为动态语言的关键。
  • 反射机制允许程序在执行期间,借助 Reflection API 取得任何类的内部消息,并能直接操作任意对象的内部属性及方法。

对象就像一面镜子,透过镜子看到类的结构——反射。

正常方式:引入需要的“包类”名称 → new实例化 → 取得实例化对象
反射方式:实例化对象 → getClass()方法 → 得到完整的“包类”名称

为什么可以这样?

一个类被加载后,类的整个结构信息都会被封装在一个Class类型的对象中(一个类在内存中只有一个Class对象)。

实例

public class Test {public static void main(String[] args) throws ClassNotFoundException {Class c1 = Class.forName("com.pojo.User");}
}//实体类:pojo/entity
class User {...}

Class类

  • Class 本身是一个类
  • Class 对象只能由系统建立
  • 一个加载的类在 JVM 中只会有一个Class对象
  • 一个Class对象对应的是一个加载到JVM中的一个.class文件
  • 每个类的实例都会记得自己是由哪个Class实例所生成的
  • 通过 Class 可以完整地得到一个类中的所有被加载的结构
  • Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class 对象
//Person person = new Person();
Class c1 = person.getClass();
Class c2 = Class.forName("Person");
Class c3 = Person.class;Class c4 = Integer.TYPE;//获得父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);

哪些类型有Class对象

  • class(外部类、成员(成员内部类、静态内部类)、局部内部类、匿名内部类)
  • interface(接口)
  • [](数组)
  • enum(枚举)
  • annotation(注解)
  • 基本数据类型
  • void
Class objectClass = Object.class; //类
Class comparableClass = Comparable.class; //接口
Class aClass = String[].class; //一维数组
Class aClass1 = int[][].class; //二维数组
Class overrideClass = Override.class; //注解
Class elementTypeClass = ElementType.class; //枚举
Class integerClass = Integer.class; //基本数据类型
Class voidClass = void.class; //void
Class classClass = Class.class; //Class
c1.getName(); //获得包名+类名
c1.getSimpleName(); //获得类名
//获得类的属性
Field[] fields = c1.getFields(); //只能找到public属性
Field[] declaredFields = c1.getDeclaredFields(); //找到全部的属性Field field = c1.getField("id");
Field name = c1.getDeclaredField("name");//获得类的方法
Method[] methods = c1.getMethods(); //获得本类及其父类的全部public
Method[] declaredMethods = c1.getDeclaredMethods(); //获得本类的所有方法//因为有重载,所以需要指定参数类型
Method getId = c1.getMethod("getId", null);
Method setId = c1.getMethod("setId", String.class);//获得指定的构造器
c1.getConstructors();

相关文章:

反射(一)

动态 VS 静态语言 动态语言:运行时,可以改变其结构。 Object-C、C#、JS、PHP、Python JS 就是动态语言。 function f() {var x "var a3; var b5; alert(ab)";eval(x); }静态语言:运行时,结构不可变。 Java、C、C J…...

29.利用fminbnd 求解 最大容积问题(matlab程序)

1.简述 用于求某个给定函数的最小值点。 使用方法是: xfminbnd(func,x1,x2) func是函数句柄,然后x1和x2就是函数的区间,得到的结果就是使func取最小值的x值 当然也可以使用[x,fv]fminbnd(func,x1,x2)的方式,这个时候fv就是函数…...

express学习笔记7 - docker跟mysql篇

安装Docker和Navicat Docker 进官⽹https://docs.docker.com/get-docker/ 选择机型安装即可。 Navicat(也可以在网上找个破解版本) 进官⽹https://www.navicat.com/en/products/navicat-premium 安装完之后连接新建⼀个数据库连接 然后再⾥⾯新建⼀个数…...

Leetcode(一):数组、链表部分经典题目详解(JavaScript版)

数组、链表部分算法题 一、数组1. 二分查找2. 移除数组元素3. 有序数组的平方4. 长度最小的子数组5. 螺旋矩阵 二、链表1. 删除链表元素2. 设计链表3.反转链表4.两两交换链表中的节点5.删除链表倒数第n个节点6.环形链表 提前声明:本博客内容均为笔者为了方便个人理解…...

内网穿透的底层原理是什么

目录 内网穿透的功能 内网穿透的底层原理 内网穿透的功能 前段时间研究了一下内网穿透,果真是一个神奇的技术,就拿企业级内网穿透-神卓互联来说,在需要在本地安装一个神卓互联客户端,简单设置一下服务应用的端口号,就…...

Bash配置文件

当Bash以登录Shell启动的时候,会首先读取并执行文件“/etc/profile”中的命令。 接着,Bash会依次查找文件“~/.bash_profile”,“~/.bash_login”,“~/.profile”,读取并执行找到的第一个文件中的命令。也就是说&…...

写Acknowledgement的时候,latex日志出现警告

用latex写论文的时候,\section{Conclusion}下面添加 \backmatter \bmhead{Acknowledgments}时报错:错误log: \bmhead Package hyperref Warning: Difference (4) between bookmark levels is greater than one, level....错误原因&#xff…...

GCC生成map文件

要生成GCC的map文件&#xff0c;可以使用以下指令&#xff1a; gcc <source_files> -Wl,-Map<output_file>.map 其中&#xff0c; <source_files>是要编译的源文件列表&#xff0c;<output_file>是生成的map文件的名称-Wl选项告诉GCC将后面的参数传…...

IOS看书最终选择|源阅读转换|开源阅读|IOS自签

环境&#xff1a;IOS想使用 换源阅读 问题&#xff1a;换新手机&#xff0c;源阅读下架后&#xff0c;没有好的APP阅读小说 解决办法&#xff1a;自签APP 转换源仓库书源 最终预览 &#xff1a;https://rc.real9.cn/ 背景&#xff1a;自从我换了新iPhone手机&#xff0c;就无法…...

easyui实用点

easyui实用点 1.下拉框&#xff08;input框只能选不能手动输入编辑&#xff09; data-options"editable:false"//不可编辑2.日期框&#xff0c;下拉框&#xff0c;文本框等class class"easyui-datebox"//不带时分秒 class"easyui-datetimebox"…...

算法训练营第五十六天||● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇

● 583. 两个字符串的删除操作 这道题涉及到两个字符串删除操作&#xff0c;注意递推公式&#xff0c;理解不到位&#xff0c;需要再次做 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾…...

C语言每日一题:10.不使用+-*/实现加法+找到所有数组中消失的数。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 1.两个数二进制之间进行异或如果不产生进位操作那么两个数的和就是就是两个数进行异或的结果。 举例&#xff1a;5&#xff08;0101&#xff09;2&#xff08;0010&#xff09;进行异或等于&#xff1a;7&#xf…...

LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

1、问题&#xff1a; https://github.com/CocoaPods/Specs.git/&#xff1a;LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443的解决办法 出现这个问题的原因基本都是代理的问题&#xff1a; 只需要加上代理就可以了&#xff1a; #http代理 git conf…...

JS数组的详解与使用

什么是数组&#xff1f; 数组是一种有序的集合&#xff0c;有长度和索引&#xff0c;以及身上有许多的API方法 面试题&#xff1a;数组和伪数组的区别&#xff1a;数组和伪数组都有长度和索引&#xff0c;区别是数组身上有许多的API方法 而伪数组身上不存在这些API方法创建数组…...

c++ / python / java / PHP / SQL / Ruby / Objective-C / JavaScript 发展史

c发展史 C是由丹尼斯里奇和肯汤普森在1970年代早期开发的C语言的扩展。C最初被称为“C with Classes”&#xff0c;是在1980年代初期由比雅尼斯特劳斯特鲁普开发的。 1983年&#xff0c;斯特劳斯特鲁普将C with Classes重新命名为C。在1985年&#xff0c;C编译器的第一个版本被…...

Linux第一个小程序-进度条(缓冲区概念)

1.\r和\n C语言中有很多字符 a.可显字符 b.控制字符 对于回车其实有两个动作&#xff0c;首先换行&#xff0c;在将光标指向最左侧 \r &#xff1a;回车 \n&#xff1a;换行 下面举个例子&#xff1a; 把\n去掉会怎样 什么都没输出。为什么&#xff1f; 2.缓冲区概念 观察下两个…...

CentOS7环境安装tomcat

环境准备 由于是在练习&#xff0c;为了方便&#xff0c;我们可以 1.关闭防火墙 systemctl disable firewalld.service systemctl stop firewalld.service 2.关闭selinux 在/etc/selinux/config中&#xff0c;设置&#xff1a; SELINUXdisabled 3.准备jdk---》jdk-8u333-li…...

C# 中使用ValueTask优化异步方法

概要 我们在开发过程中&#xff0c;经常使用async的异步方法&#xff0c;但是有些时候&#xff0c;异步的方法中&#xff0c;可能包含一些同步的处理。本文主要介绍通过ValueTask这个struct&#xff0c;优化异步处理的方法性能。 代码及实现 有些时候我们会缓存一些数据在内…...

KVM创建新的虚拟机(图形化)

1.启动kvm管理器 [rootlocalhost ~]# virt-manager2.点击创建虚拟机 3.选择所需os安装镜像 4.选择合适的内存大小和CPU 5.创建所需磁盘 6.命名创建的虚拟机...

正则表达式在格式校验中的应用以及包装类的重要性

文章目录 正则表达式&#xff1a;做格式校验包装类&#xff1a;在基本数据类型与引用数据类型间的桥梁总结 在现代IT技术岗位的面试中&#xff0c;掌握正则表达式的应用以及理解包装类的重要性是非常有益的。这篇博客将围绕这两个主题展开&#xff0c;帮助读者更好地面对面试挑…...

UE5.6低延迟视频推流实战:从采集编码到RTMP传输全链路解析

1. 这不是“加个插件就能播”的事&#xff1a;UE5.6视频流推送的真实战场 很多人看到“UE5.6推送视频流”这个标题&#xff0c;第一反应是&#xff1a;“哦&#xff0c;用Media Player播放本地MP4&#xff1f;或者接个RTMP推流插件&#xff1f;”——我试过&#xff0c;也踩过坑…...

spring源码bean生命周期篇 五 如何解决循环依赖

一.spring循环依赖 1. 什么是循环依赖&#xff1f; bean的生命周期前面的章节我们有讲解过大量的源码&#xff0c;我们粗略的分为这几步 spring扫描class获取BeanDefintionspring根据BeanDefintion实例化bean创建bean之前需要实例化对象&#xff0c;实例化后填充原始对象中的属…...

3步掌握暗黑2存档编辑:从游戏小白到修改高手的完整教程

3步掌握暗黑2存档编辑&#xff1a;从游戏小白到修改高手的完整教程 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾在暗黑破坏神2中花费数百小时刷装备却一无所获&#xff1f;是否因为角色build配置不当而不得不重新练级…...

如何高效解决Windows游戏控制器兼容性问题:ViGEmBus驱动完整指南

如何高效解决Windows游戏控制器兼容性问题&#xff1a;ViGEmBus驱动完整指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款专业的Windows内…...

【SpringBoot 3.x 第202节】微服务拆分方法论:什么时候该拆,什么时候不该拆?

&#x1f3c6;本文收录于《滚雪球学SpringBoot 3.x》&#xff0c;专门攻坚指数提升&#xff0c;本年度国内最系统最专业最详细&#xff08;永久更新&#xff09;。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容&#xff0c;&#x1f680;均为全网独家首发…...

Poppins几何字体:如何让拉丁文与天城体在同一个视觉世界里和谐共舞?

Poppins几何字体&#xff1a;如何让拉丁文与天城体在同一个视觉世界里和谐共舞&#xff1f; 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 当你的产品需要同时面向印度用户和全…...

Jenga框架双引擎设计:视频生成效率优化解析

1. Jenga框架核心设计解析Jenga视频生成框架的核心创新在于其双引擎设计&#xff1a;渐进式分辨率(ProRes)和动态块稀疏注意力(AttenCarve)。这两种技术协同工作&#xff0c;解决了Transformer架构在视频生成中的计算效率瓶颈。1.1 渐进式分辨率技术(ProRes)ProRes采用分阶段生…...

STM32H750 ADC性能调优指南:牺牲分辨率换速度?快速转换模式深度实测

STM32H750 ADC性能调优实战&#xff1a;如何在速度与精度间找到最佳平衡点 最近在做一个电机控制项目时&#xff0c;遇到了一个棘手的问题——ADC采样速度跟不上PWM频率的变化。当我尝试将PWM频率提升到20kHz以上时&#xff0c;系统开始出现明显的控制延迟。这个问题让我不得不…...

LCD人体秤嵌入式方案全解析:从传感器到低功耗设计

1. 项目概述&#xff1a;从“称重”到“健康管理”的智能跨越“电子秤方案——LCD人体秤方案”这个标题&#xff0c;乍一看似乎只是关于一个简单的称重工具。但在这个全民关注健康、数据驱动生活的时代&#xff0c;一台现代的人体秤早已超越了“称体重”的单一功能。它集成了传…...

海思Hi3516CV608×PSRAM|AI全彩IPC黄金硬件方案

一、海思Hi3516CV608核心应用特性&#xff08;AI全彩IPC主力主控&#xff09;芯片原生内置512Mbit DDR2&#xff0c;满足系统运行、视频编码、基础ISP图像处理&#xff0c;硬件资源稳定可靠。集成硬件NPU&#xff08;0.2TOPS&#xff09;&#xff0c;原生支持人形检测、越界侦测…...