目录

一、概述

二、class类:

1、获取类的字节码文件:

(1)方式一:直接通过一个class的静态变量class获取

(2)方式二:如果知道一个class的完整类名,可以通过静态方法Class.forName()获取

(3)方式三:通过具体对象的getClass方法获取

2、Class.newInstance()通过字节码文件对象创建具体类的实例:(此类中必须有无参构造方法)

3、Class常用的方法:

三、调用构造方法

1、getConstructors() 获取所有被public修饰的构造方法

2、getDeclaredConstructors()获取所有的构造方法(不受访问修饰符限制)

3、getConstructor()获取某个指定的被public修饰的构造方法

4、getDeclaredConstructor 获取指定的某个构造方法 可以给泛型

5、解剖构造方法

(1)getModifiers():获取构造方法的权限修饰符:包访问修饰符-0 public-1 private-2 protected-4

(2)setAccessible(true):临时取消权限校验符

四、获取继承关系:

1、getSuperclass():获取该类继承的类,返回Class对象

2、getlnterfaces():获取该类实现的所有接口,返回Class 型数组

五、访问字段

1、获取成员变量:

(1)getFields()获取所有的被public修饰的成员变量(包含父类的成员变量)

(2)getDeclaredFields()获取所有本类中的成员变量(包含私有的等)

(3)getField()获取本类中或者父类中的某个被public修饰的成员变量

(4)getDeclaredField()获取本类中的某个成员变量

2、解剖成员变量:

(1)getModifiers():获取权限修饰符

(2)getType():获取数据类型

(3)getName():获取变量名

3、应用:

(1)get(Object   o):获取对象中此成员变量的值:

(2)set(Object   o, Object  Value)设置对象中此成员变量的值

(3)注意事项:静态成员变量不依赖于对象,静态成员变量共享一片空间,所以可以不传入对象,直接修改修改


一、概述

   Java 反射机制是 Java 语言的一个重要特性。在学习 Java 反射机制前,大家应该先了解两个概念:编译期和运行期。

编译期:是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作。比如:检查语法错误。

运行期:是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来。

       Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

Java 反射机制在服务器程序和中间件程序中得到了广泛运用。在服务器端,往往需要根据客户的请求,动态调用某一个对象的特定方法或者为属性赋值。例如:在主流的 ORM 框架的实现中,运用 Java 反射机制可以读取任意一个 JavaBean 的所有属性,或者给这些属性赋值。

Java 反射机制主要提供了以下功能,这些功能都位于java.lang.reflect包。

  • 在运行时判断任意一个对象所属的类。
  • 在运行时构造任意一个类的对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时调用任意一个对象的方法。
  • 生成动态代理。

二、class类:

      要想知道一个类的属性和方法,必须先获取到该类的字节码文件对象。获取类的信息时,使用的就是 Class 类中的方法。所以先要获取到每一个字节码文件(.class)对应的 Class 类型的对象.class(包括interface)的本质是数据类型(Type)。class是由JVM在执行过程中动态加载的。JVM在第一次读取到一种class类型时,将其加载进内存。每加载一种classJVM就为其创建一个Class类型的实例,并关联起来。

注意:这里的Class类型是一个名叫Classclass。

1、获取类的字节码文件:

(1)方式一:直接通过一个class的静态变量class获取
 //方式一:直接通过一个class的静态变量class获取Class clazz1=Person.class;System.out.println(clazz1);
(2)方式二:如果知道一个class的完整类名,可以通过静态方法Class.forName()获取
//方式二:如果知道一个class的完整类名,可以通过静态方法Class.forName()获取Class clazz2=Class.forName("com.yuan.reflection.Person");System.out.println(clazz2);
(3)方式三:通过具体对象的getClass方法获取
  //方式三:通过具体对象的getClass方法获取Person p1=new Person();Class clazz3=p1.getClass();System.out.println(clazz3);

2、Class.newInstance()通过字节码文件对象创建具体类的实例:(此类中必须有无参构造方法)

 //通过Class.newInstance()可以创建类的实例,要求实例必须要有公共的无参构造方法,否则报错Object p2 = clazz1.newInstance();System.out.println(p2);

3、Class常用的方法:

类型

访问方法

返回值类型

说明

包路径

getPackage()

Package 对象

获取该类的存放路径

类名称

getName()

String 对象

获取该类的名称

继承类

getSuperclass()

Class 对象

获取该类继承的类

实现接口

getlnterfaces()

Class 型数组

获取该类实现的所有接口

构造方法

getConstructors()

Constructor 型数组

获取所有权限为 public 的构造方法

getDeclaredContruectors()

Constructor 对象

获取当前对象的所有构造方法

方法

getMethods()

Methods 型数组

获取所有权限为 public 的方法

getDeclaredMethods()

Methods 对象

获取当前对象的所有方法

成员变量

getFields()

Field 型数组

获取所有权限为 public 的成员变量

getDeclareFileds()

Field 对象

获取当前对象的所有成员变量

三、调用构造方法

1、getConstructors() 获取所有被public修饰的构造方法

2、getDeclaredConstructors()获取所有的构造方法(不受访问修饰符限制)

3、getConstructor()获取某个指定的被public修饰的构造方法

4、getDeclaredConstructor 获取指定的某个构造方法 可以给泛型

5、解剖构造方法

(1)getModifiers():获取构造方法的权限修饰符:包访问修饰符-0 public-1 private-2 protected-4
(2)setAccessible(true):临时取消权限校验符
public class Demo04 {public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//1、获取类的字节码文件对象Class<Person> clazz = Person.class;//2、获取构造方法//getConstructors() 获取所有被public修饰的构造方法
//        Constructor[] cons = clazz.getConstructors();
//        for (Constructor con:cons) {
//            System.out.println(con);
//        }//getDeclaredConstructors()获取所有的构造方法(不受访问修饰符限制)Constructor[] cons = clazz.getDeclaredConstructors();for (Constructor con:cons) {System.out.println(con);}//getConstructor()获取某个指定的被public修饰的构造方法Constructor con = clazz.getConstructor();System.out.println(con);//getDeclaredConstructor 获取指定的某个构造方法   可以给泛型Constructor<Person> con1=clazz.getDeclaredConstructor(String.class,int.class);System.out.println(con1);//3、解剖//包-0 public-1 private-2 protected-4int modifier = con1.getModifiers();System.out.println(modifier);System.out.println("权限修饰符是否是公共的"+Modifier.isPublic(modifier));Parameter[] parameters = con1.getParameters();for (Parameter p:parameters) {System.out.println(p.getType()+"_"+p.getName());}//4、实例化对象con1.setAccessible(true);//临时取消权限校验符Person p1 = con1.newInstance("张三", 13);//注意构造方法要为public,不是公共的需要设置取消临时校验符System.out.println(p1);}
}

四、获取继承关系:

1、getSuperclass():获取该类继承的类,返回Class对象

2、getlnterfaces():获取该类实现的所有接口,返回Class 型数组

public class Demo03 {public static void main(String[] args) {Class clazz = Person.class;//包路径 getPackage()  Package对象获取该类的存放路径Package pac = clazz.getPackage();System.out.println(pac);//类名称 getName() String对象 获取该类的名称String strName = clazz.getName();System.out.println(strName);//继承类getSuperclass() Class对象 获取该类继承的类Class supclasss = clazz.getSuperclass();System.out.println(supclasss);//实现的接口Class[] cles = clazz.getInterfaces();System.out.println(Arrays.toString(cles));}
}

五、访问字段

1、获取成员变量:

(1)getFields()获取所有的被public修饰的成员变量(包含父类的成员变量)
(2)getDeclaredFields()获取所有本类中的成员变量(包含私有的等)
(3)getField()获取本类中或者父类中的某个被public修饰的成员变量
(4)getDeclaredField()获取本类中的某个成员变量
        Class<Dog> clazz = Dog.class;//2、获取成员变量
//        //getFields()获取所有的被public修饰的成员变量(包含父类的成员变量)Field[] fields = clazz.getFields();for (Field f:fields) {System.out.println(f);}//getDeclaredFields()获取所有本类中的成员变量(包含私有的等)Field[] fields2 = clazz.getDeclaredFields();for (Field f:fields2) {System.out.println(f);}//getField()获取本类中或者父类中的某个被public修饰的成员变量Field field = clazz.getField("type");System.out.println(field);//getDeclaredField()获取本类中的某个成员变量Field field = clazz.getDeclaredField("color");System.out.println(field);

2、解剖成员变量:

(1)getModifiers():获取权限修饰符
(2)getType():获取数据类型
(3)getName():获取变量名
        //获取权限修饰符int modifier = field.getModifiers();System.out.println("权限修饰符为:"+modifier);//获取数据类型Class typeClass = field.getType();System.out.println("数据类型为:"+typeClass);//获取变量名String name = field.getName();System.out.println("此成员变量的变量名为:"+name);

3、应用:

(1)get(Object   o):获取对象中此成员变量的值:
(2)set(Object   o, Object  Value)设置对象中此成员变量的值
(3)注意事项:静态成员变量不依赖于对象,静态成员变量共享一片空间,所以可以不传入对象,直接修改修改
        Dog d2=new Dog();Dog d1=new Dog("花花",5,"田园犬",20.0,25,"花色");
//        field.setAccessible(true);//临时取消校验符
//        //获取d1对象中此成员变量的值
//        Object obj = field.get(d1);
//        System.out.println("获取到成员变量type对应对象d1的值"+obj);
//        //设置对象d1中此成员变量的值为黑白
//        field.set(d1,"黑白");
//        System.out.println(d1);//静态成员变量不依赖于对象field.setAccessible(true);//临时取消校验符//获取静态成员变量,不依赖于对象二存在,所以获取此成员变量的值时,可以不传对象Object obj = field.get(null);System.out.println("获取到成员变量type对应对象d1的值"+obj);//设置成员变量值,静态成员变量共享一片空间,所以可以修改field.set(null,"黑白");System.out.println(d1);System.out.println(d2);
public class Animal {public String name;private int age;public Animal(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +", age=" + age +'}';}
}
package com.yuan.reflection;public class Dog extends Animal{public String type;protected double weight;int height;public static String color;public Dog() {super("小白",23);}public Dog(String name, int age, String type, double weight, int height, String color) {super(name, age);this.type=type;this.weight=weight;this.height=height;this.color=color;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", type='" + type + '\'' +", weight=" + weight +", height=" + height +", color=" + color +'}';}
}

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

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

相关文章

CVE-2021-1879

一、漏洞原理 CVE-2021-1879 是 IBM WebSphere Application Server 中存在的一个 路径遍历&#xff08;Path Traversal&#xff09; 漏洞&#xff0c;其核心原理为&#xff1a; ①WebSphere 在处理某些文件操作请求&#xff08;如下载、上传或配置文件读取&#xff09;时&#…

二进制签名查找器(Aho-Corasick 自动机):设计思路与实现原理(C/C++代码实现)

在逆向工程、恶意软件分析和二进制文件解析领域&#xff0c;快速准确地识别特定字节模式&#xff08;即“签名”&#xff09;是一项核心任务。本文将围绕一款基于PE-bear工具的二进制签名查找器&#xff0c;深入解析其设计思路、实现原理及相关技术背景&#xff0c;揭示其如何高…

後端開發技術教學(二) 條件指令、循環結構、定義函數

書接上回&#xff1a;後端開發技術教學(一) [附2025最新可用 phpstudy2018下載鏈接] -CSDN博客 必要資源&#xff1a; trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一键部署 PHP 开发环境 小皮出品 目录 一、條件指令 1.1 if() …

状压DP-基本框架

状压DP-基本框架一、状压DP的核心思想与适用场景1.1 问题特征1.2 核心思想1.3 与传统DP的对比二、位运算基础&#xff1a;状压DP的语法三、状压DP的基本框架3.1 步骤拆解3.2 通用代码模板四、经典案例详解4.1 旅行商问题&#xff08;TSP&#xff09;问题描述状压DP设计代码实现…

Web 端 AI 图像生成技术的应用与创新:虚拟背景与创意图像合成

随着 Stable Diffusion、Midjourney 等生成式 AI 模型的爆发,Web 端图像生成技术从“实验室demo”走向“工业化应用”。其中,虚拟背景替换(如视频会议的动态背景生成)和创意图像合成(如用户上传素材与 AI 生成元素的融合)成为最具代表性的场景,它们通过“文本描述→AI 生…

应急响应知识总结

应急响应 Windows系统 查账号 1、查看服务器是否有弱口令&#xff0c;远程管理端口是否对公网开放。 检查方法&#xff1a;据实际情况咨询相关服务器管理员。 2、查看服务器是否存在可疑账号、新增账号。 检查方法&#xff1a;打开 cmd 窗口&#xff0c;输入 lusrmgr.msc …

智慧水务赋能二次供水管理精细化转型:物联网驱动的全链路解决方案

随着我国城镇化率激增&#xff0c;高层建筑占比上升&#xff0c;二次供水系统已成为保障城市供水安全的核心环节。然而&#xff0c;传统管理模式面临设备老化、运维粗放、监管缺失等矛盾&#xff0c;在此背景下&#xff0c;《“十四五”节水型社会建设规划》明确要求推进二次供…

tsmc 5nm lvs之 short难搞的类型

1、M3层以上的层次发生的short&#xff0c;dengsity很高的情况下&#xff0c;两根信号net导致的short&#xff0c;删除其中一根然后ecoRoute fix不掉的情况下&#xff0c;该怎么办&#xff0c;可以尝试去cut 周围或者上方的power。 2、M1&#xff0c; M2由于cell 内部出pin&…

初识神经网络01——认识PyTorch

文章目录一、认识PyTorch1.1 PyTorch是什么1.2 安装PyTorch二、认识Tensor2.1 创建Tensor2.1.1 基本方式2.2.2 创建线性和随机张量2.2 Tensor属性2.2.1 切换设备2.2.2 类型转换2.3 Tensor与Numpy的数据转换2.3.1 张量转ndarray2.3.2 Numpy转张量2.4 Tensor常见操作2.4.1 取值2.…

Android UI 组件系列(十一):RecyclerView 多类型布局与数据刷新实战

博客专栏&#xff1a;Android初级入门UI组件与布局 源码&#xff1a;通过网盘分享的文件&#xff1a;Android入门布局及UI相关案例 链接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd4k9n 提取码: 4k9n 引言 在 Android 应用中&#xff0c;RecyclerView 是最常用…

如何学习跨模态对齐(尤其是 CLIP 思想)

学习跨模态对齐&#xff08;尤其是CLIP思想&#xff09;需要结合理论基础、经典模型原理、实践复现和前沿扩展&#xff0c;以下是一套系统的学习路径&#xff0c;从入门到深入逐步展开&#xff1a; 一、先补基础&#xff1a;跨模态对齐的“前置知识” 跨模态对齐的核心是让图…

日记研究:一种深入了解用户真实体验的UX研究方法

在用户体验&#xff08;UX&#xff09;研究中&#xff0c;我们常常需要了解用户在真实世界中如何与产品互动。然而&#xff0c;由于时间和空间的限制&#xff0c;我们很难像“特工”一样全天候跟踪用户。这时&#xff0c;“日记研究”&#xff08;Diary Studies&#xff09;就成…

鸿蒙app 开发中 加载图片的时候闪一下 如何解决

1.解决 在图片上 加载这个属性 .syncLoad(true) 参考的官方链接

【OS】进程与线程

进程进程实体代码段相关数据PCB进程标识符外部标识符&#xff1a;为方便用户对进程的访问&#xff0c;为每个进程设置一个外部标识符&#xff0c;通常由字母和数字组成内部标识符&#xff1a;为方便系统对进程的使用&#xff0c;在OS中又为进程设置了内部标识符&#xff0c;赋予…

Django 序列化详解:从 Model 到 JSON,全面掌握数据转换机制

一、引言&#xff1a;什么是 Django 序列化&#xff1f;在 Web 开发中&#xff0c;序列化&#xff08;Serialization&#xff09; 是指将复杂的数据结构&#xff08;如数据库模型对象&#xff09;转换为可传输的格式&#xff08;如 JSON、XML、YAML 等&#xff09;&#xff0c;…

茶叶蛋大冒险小游戏流量主微信抖音小程序开源

游戏特点 响应式设计&#xff1a;完美适配各种移动设备屏幕尺寸 直观的触摸控制&#xff1a;左右滑动屏幕控制茶叶蛋移动 中式风格元素&#xff1a; 茶叶蛋角色带有裂纹纹理和可爱表情 筷子、蒸笼等中式厨房元素作为障碍物 八角、茶叶等香料作为收集物 锅底火焰动画效果 游戏机…

区分邮科工业交换机与路由器

在这个数字化的时代&#xff0c;我们每天都在享受着互联网带来的便利。无论是工作还是娱乐&#xff0c;网络已经成为我们生活中不可或缺的一部分。然而&#xff0c;在这个看似简单的背后&#xff0c;隐藏着两个至关重要的设备——邮科工业交换机和路由器。它们就像网络世界的双…

【数据结构入门】数组和链表的OJ题(2)

目录 1.回文链表 分析&#xff1a; 代码&#xff1a; 2.相交链表 分析&#xff1a; 代码&#xff1a; 3.环形链表 分析&#xff1a; 代码&#xff1a; 面试提问&#xff1a; 4.环形链表II 分析1&#xff1a; 分析2&#xff1a; 代码&#xff1a; 5.随机链表的复…

文件包含篇

web78 第一题filter伪协议直接读源码即可 ?filephp://filter/convert.base64-encode/resourceflag.php web79 flag.php的php无法用大小写绕过&#xff0c;所以用Php://input只读流 import requests url "http://fadb524a-f22d-4747-a35c-82f71e84bba7.challenge.ctf.sho…

互作蛋白组学技术对比:邻近标记与传统IP-MS、Pull down-MS优势对比

在生命科学领域&#xff0c;蛋白质间的相互作用构成了生命活动的核心网络&#xff0c;驱动着信号传导、基因调控、代谢途径等关键过程。为了绘制这幅复杂的“分子互作地图”&#xff0c;科学家们开发了多种技术&#xff0c;其中免疫共沉淀结合质谱&#xff08;IP-MS&#xff09…