【Java常用】注解与反射_2.反射

目录标题

  • 1.Java反射机制概述
    • 1.静态 VS 动态语言
      • 1.1动态语言
        • 举例展示JavaScript作为动态语言的特性
            • 1. 运行时代码生成和执行
            • 2.动态变量创建
            • 3.对比静态语言(如 Java):
      • 1.2 静态语言
  • 2.理解Class类并获取Class实例
  • 3.类的加载与ClassLoader
  • 4.创建运行时类的对象
  • 5.获取运行时类的完整结构
  • 6.调用运行时类的指定结构

1.Java反射机制概述

1.静态 VS 动态语言

1.1动态语言

是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。
主要动态语言:0bject-C、C#、JavaScript、PHP、Python等
比如

举例展示JavaScript作为动态语言的特性
function f() {var x = "var a=3;var b=5;alert(a+b)";eval(x);
}

这段代码很好地展示了JavaScript作为动态语言的特性,让我解释原因:

1. 运行时代码生成和执行

javascript

var x = “var a=3;var b=5;alert(a+b)”;
eval(x);

代码是以字符串形式存在的
这些代码是在运行时被解析和执行的,而不是在编译时
程序可以在运行过程中动态生成和执行新的代码

2.动态变量创建

变量 a 和 b 不是预先定义的
它们是在代码运行时,通过 eval 执行字符串时才被创建的
这体现了变量可以动态创建的特性

3.对比静态语言(如 Java):

java

// Java 需要预先声明变量类型,不能动态执行字符串代码
String x = “int a=3; int b=5; System.out.println(a+b)”;
// 不能直接执行字符串作为代码

这个例子展示了 JavaScript 的两个重要动态特性:

代码可以在运行时动态生成和执行
变量可以在运行时动态创建和修改

1.2 静态语言

与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++
Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动态性我们可以利用反射机制获得类似动态语言的特性。Java的动态性让编程的时候更加灵活!

在这里插入图片描述
反射就像是一面镜子,让我们能够在运行时"照见"类的内部结构。

// 传统方式创建对象
User user = new User();// 反射方式创建对象
Class c = Class.forName("com.example.User");
Object obj = c.newInstance();

正常方式 vs 反射方式:

正常方式:

引入需要的包/类名
使用 new 实例化
获得实例化对象

反射方式:

已有实例化对象
使用 getClass() 方法
获得完整的类名

反射的主要用途:

// 获取类的信息
Class c = Class.forName("java.lang.String");// 获取类的方法
Method[] methods = c.getMethods();// 获取类的属性
Field[] fields = c.getFields();// 调用方法
Method method = c.getMethod("length");
Object result = method.invoke(str);

为什么需要反射:

		Java反射机制研究及应用Java反射机制提供的功能在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判断任意一个类所具有的成员变量和方法在运行时获取泛型信息在运行时调用任意一个对象的成员变量和方法在运行时处理注解生成动态代理可以在运行时检查类、接口、方法和字段可以在运行时调用任意方法可以在运行时创建新对象让Java具有动态语言的特性

Java反射优点和缺点

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

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

简单来说,反射就像是给Java装上了"透视眼",能够在程序运行时看到并操作类的内部结构,这是Java被称为动态语言的重要原因之一。

反射相关的主要API

	>java.lqng.Class:代表一个类>java.lang.reflect.Method:代表类的方法>java.lang.reflect.Field:代表类的成员变量>java.lang.reflect.Constructor:代表类的构造器

API 让我们能够:

	在运行时检查类的结构调用任意方法访问任意字段创建新的对象修改访问权限

这就像是给了我们一把"万能钥匙",可以在程序运行时访问和操作类的所有组成部分。

复习泛型
1.

package com.zyy.refletion;import java.util.ArrayList;//什么叫反射
public class Test02 {public static void main(String[] args) throws ClassNotFoundException {
//        通过反射获取类的class对象Class<?> aClass = Class.forName("com.zyy.refletion.User");//1、没有泛型时的问题
//        想要一个存放整数的集合ArrayList list = new ArrayList();list.add(1); //添加整数 byte short int long int默认值是0不能为nullint num = (int) list.get(0);//从数组中取出后 必须通过int 强转后,才能赋值给int//        2、使用泛型后
//明确指定集合中存放的是整数ArrayList<Integer> list1 = new ArrayList<Integer>();  //int 是基本数据类型,Integer 是类,包装类,有更多的方法可以使用list.add(1); //添加整数int num1 = list1.get(0);//不需要强制类型转换//        3.场景实例
//     现在需要不同类型的盒子: 只能装水果的盒子  只能装书的盒子  只能装玩具的盒子
//        T可以十四任何类型的物品,比如fruit book toyclass Box<T> {private T item;//盒子里面的东西  私有化变量// 拿和取的动作 get setpublic void setItem(T item) { // 放东西进盒子this.item = item;}public T getItem() {// 从盒子取东西return item;}}// 首先定义 Fruit 类class Fruit {private String name;public Fruit(String name) {this.name = name;}public String getName() {return name;}}// 创建一个装水果的盒子Box<Fruit> fruitBox = new Box<>();// 创建一个水果并放入盒子Fruit apple = new Fruit("苹果");fruitBox.setItem(apple);// 从盒子中取出水果Fruit fruit = fruitBox.getItem();System.out.println(fruit.getName());  // 输出:苹果}}/*   实体类的作用:存储数据:就像一个容器,用来存放某个对象(比如学生)的所有信息规范数据:确保数据的格式正确(比如年龄必须是数字)传递数据:在程序的不同部分之间传递完整的信息简单来说,实体类就是用来描述一个现实世界中的"东西"(比如学生、商品、订单等)的Java类,它主要负责数据的存储和传递。*///    实体类  只有一些私有属性(就像表格中要填的项目)
class User {//        私有属性private String name;private int id;private int age;// 无参构造public User() {}
//    有参构造public User(String name, int id, int age) {this.name = name;this.id = id;this.age = age;}// 因为是私有属性 所以为了访问和修改数据,还要get set// 获取信息的方法(读取表格)public String getName() {return name;}// 设置信息的方法(填写表格)public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 加上toSreing  方便调试@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", id=" + id +", age=" + age +'}';}
}

2.理解Class类并获取Class实例

3.类的加载与ClassLoader

4.创建运行时类的对象

5.获取运行时类的完整结构

6.调用运行时类的指定结构

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

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

相关文章

MySQL主从同步+binlog

一、简介 MySQL内建的复制功能是构建大型&#xff0c;高性能应用程序的基础 通过将MySQL的某一台主机&#xff08;master&#xff09;的数据复制到其他主机&#xff08;slaves&#xff09;上&#xff0c;并重新执行一遍来执行 复制过程中一台服务器充当主服务器&#xff0c;而…

PCB多层板打样:深度解析优缺点与应用场景

随着电子产品朝小型化、高性能化方向发展&#xff0c;PCB多层板扮演着越来越重要的角色。无论是智能手机、计算机&#xff0c;还是航空航天、工业控制&#xff0c;多层板都发挥着至关重要的作用。像专业的PCB制造商——嘉立创&#xff0c;凭借超高层工艺&#xff0c;可以生产最…

【前端】 react项目使用bootstrap、useRef和useState之间的区别和应用

一、场景描述 我想写一个轮播图的程序&#xff0c;只是把bootstrap里面的轮播图拉过来就用上感觉不是很合适&#xff0c;然后我就想自己写自动轮播&#xff0c;因此&#xff0c;这篇文章里面只是自动轮播的部分&#xff0c;没有按键跟自动轮播的衔接部分。 Ps: 本文用的是函数…

CentOS 7操作系统部署KVM软件和创建虚拟机

CentOS 7.9操作系统部署KVM软件和配置指南&#xff0c;包括如何创建一个虚拟机。 步骤 1: 检查硬件支持 首先&#xff0c;确认您的CPU支持虚拟化技术&#xff0c;并且已在BIOS中启用&#xff1a; egrep -c (vmx|svm) /proc/cpuinfo 如果输出大于0&#xff0c;则表示支持虚拟…

RocketMQ与kafka如何解决消息丢失问题?

0 前言 消息丢失基本是分布式MQ中需要解决问题&#xff0c;消息丢失时保证数据可靠性的范畴。如何保证消息不丢失程序员面试中几乎不可避免的问题。本文主要说明RocketMQ和Kafka在解决消息丢失问题时&#xff0c;在生产者、Broker和消费者之间如何解决消息丢失问题。 1.Rocket…

APP端网络测试与弱网模拟!

当前APP网络环境比较复杂&#xff0c;网络制式有2G、3G、4G网络&#xff0c;还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异&#xff0c;都会对用户使用app造成一定影响。另外&#xff0c;当前app使用场景多变&#xff0c;如进地铁、上公交、进电梯等&#xff0c;使…

deepseek-r1 训练流程

deepseek-r1 训练流程 技术创新deepseek-v3 && deepseek-r1deepseek-r1-zero训练过程aha moment准确度提升思考时间增加 deepseek-r1冷启动推理场景强化学习数据采样&&SFT全场景强化学习结果 参考文献 技术创新 极致的成本控制&#xff0c;媲美openAI的性能&a…

网络工程师 (35)以太网通道

一、概念与原理 以太网通道&#xff0c;也称为以太端口捆绑、端口聚集或以太链路聚集&#xff0c;是一种将多个物理以太网端口组合成一个逻辑通道的技术。这一技术使得多个端口能够并行工作&#xff0c;共同承担数据传输任务&#xff0c;从而提高了网络的传输能力和可靠性。 二…

win11电脑其他WiFi可以连,只有一个WiFi连不上

这个问题卡了一小会&#xff0c;查了一些资料 后面发现 点击“诊断网络问题” 显示没有响应 第一步 重启wlan网络适配器 解决&#xff01;&#xff01;&#xff01; 重新连接那个有问题的wifi&#xff0c;丝滑连接&#xff01;

【网络通信】传输层之UDP协议

【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 …

时间盲注、boolen盲注

获取当前数据库名 获取数据库表 获取表的列

2025_2_13 二叉搜索树(一)

1.完全二叉树和满二叉树的概念 满二叉树&#xff1a;每一层都达到最大值 完全二叉树&#xff1a;只能右下角空&#xff0c;其他位置满&#xff0c;即最后一排从左到右的中间不能由缺 2.二叉搜索树 左子树中所有结点的 key 值都比根结点的 key 值小&#xff0c;并且左子树也…

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展&#xff0c;大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世&#xff0c;为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、…

高速差分总线比较--RS422, LVDS,PECL

1. RS422A&#xff0c; 如RS422 & RS485总先&#xff0c; 0/5V的差分电平&#xff0c;匹配电阻120ohm. S2D&#xff0c; Transmitter D2S, Receiver LVDS 如SN65LVDS1&#xff0c;驱动器&#xff1a;DS90LV031&#xff08;支持预加重&#xff09;&#xff0c;接收器&…

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…

Java中如何高效地合并多个对象的List数据:方法与案例解析!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云/阿里云/华为云/51CTO&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互…

23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。

在使用这个非线性激活函数的时候&#xff0c;其实我们重点还是学习的是他们的正向怎么传播&#xff0c;以及反向怎么传递的。 如下图所示&#xff1a; 第一&#xff1a;relu函数的正向传播函数是&#xff1a;当输入值&#xff08;隐藏层&#xff09;值大于了&#xff0c;就输出…

React源码揭秘 | scheduler 并发更新原理

React 18增加了并发更新特性&#xff0c;开发者可以通过useTransition等hooks延迟执行优先级较低的更新任务&#xff0c;以达到页面平滑切换&#xff0c;不阻塞用户时间的目的。其实现正是依靠scheduler库。 scheduler是一个依赖时间片分片的任务调度器&#xff0c;React团队将…

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件&#xff0c;关节不仅需要通过机械设计实现复杂的运动能力&#xff0c;还必须通过电子组件和控制系统来精确控制这些运动。…

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…