Java20:反射

  • 1. 概念
  • 2. 获取成员变量
    • 2.1 获取public修饰的成员变量
    • 2.2 获取已声明的属性
  • 3.获取方法
    • 3.1 获取public修饰的,和继承自父类的 方法
    • 3.2 获取本类中定义的方法
  • 4. 获取构造器
    • 4.1 获取所有public修饰的构造器
    • 4.2 获取本类中定义的构造器
  • 5.jdk文件分析
    • 5.1bin目录:
    • 5.2 include:底层用的是C++写的
    • 5.3 jre:运行环境
    • 5.4 lib : 包含jar包
  • 6、获取类名

第一个阶段
Java代码三个阶段01
第二个阶段
![Java代码三个阶段02第三个阶段

Java代码三个阶段03
反射-获取Class对象的三种方式:
反射-获取Class对象的三种方式

反射:框架设计的灵魂。

1. 概念

官方解释:反射是指在程序运行过程中,动态的获取类的信息,并且访问

我们通过反射还是获取类的信息(属性,方法,构造方法),然后访问,只不过我们现在不再以new的方式获取

反射的好处:

​ 1、可以在程序运行过程中,操作这些对象

​ 2、可以解耦,提高程序的可

Java中反射相关的API都位于java.lang.reflect包下

万物皆对象

Class 类

Method 方法

Filed 属性

Constructor 构造方

2. 获取成员变量

2.1 获取public修饰的成员变量

getFields() 获取所有的public修饰的属性/成员变量

​ 操作:(1)设置值;(2)获取值

getField(String name)根据名字获取单个属性对象

package com.qfedu.test1;import java.lang.reflect.Field;
/*** 	获取public声明的所有的属性信息 并且访问* @author WHD**/
public class Student {public String name;public int age;public String address;public Student() {System.out.println("Student类的无参构造");}public static void main(String[] args) {try {// 根据包名+ 类名 (全限定名)获取类信息文件Class<?> stuClass = Class.forName("com.qfedu.test1.Student");// 调用Class类的newInstance方法 构造实例Object newInstance1 = stuClass.newInstance();Object newInstance2 = stuClass.newInstance();Object newInstance3 = stuClass.newInstance();// 通过Class对象获取到当前类所有的属性 返回值为字段数组Field [] fs = stuClass.getFields();for(Field f : fs) {System.out.println(f.getName());}// 根据字段名称获取到单个字段对象Field nameField = stuClass.getField("name");// 调用字段set方法 设置属性值nameField.set(newInstance2, "赵四");// 调用字段get方法  获取属性值System.out.println(nameField.get(newInstance2));Field ageField = stuClass.getField("age");ageField.set(newInstance1, 20);System.out.println(ageField.get(newInstance1));Field addressField = stuClass.getField("address");addressField.set(newInstance3, "象牙山");System.out.println(addressField.get(newInstance3));} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}}}

2.2 获取已声明的属性

getDeclaredFields() 获取所有已定义的属性对象 包括 private 默认 protected public

getDeclaredField(String name) 根据名字获取单个属性对象 可以是任意访问修饰符

package com.qfedu.test2;import java.lang.reflect.Field;/*** 	获取到类中所有的属性* @author WHD**/
public class Person {private String name;int age;protected String address;public char sex;public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {Class<?> personClass = Class.forName("com.qfedu.test1.Person");Field[] fs = personClass.getDeclaredFields();for (Field field : fs) {System.out.println(field.getName() + "\t" +field.getType());}Object newInstance = personClass.newInstance();Field nameField = personClass.getDeclaredField("name");nameField.set(newInstance, "广坤");nameField.setAccessible(true);//暴力反射(不会报警告)System.out.println(nameField.get(newInstance));Field sexField = personClass.getDeclaredField("sex");sexField.set(newInstance, '男');System.out.println(sexField.get(newInstance));}
}
package com.qfedu.test2;
import java.lang.reflect.Field;
/*** 	获取属性* 	getFields() 获取所有的public修饰的属性* 	getField(String name)根据名字获取单个属性对象* 	getDeclaredFields() 获取所有已定义的属性对象。包括 private 默认 protected public* 	getDeclaredField(String name) 根据名字获取单个属性对象 可以是任意访问修饰符 * @author WHD**/
public class TestPerson {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException {
//		Person p = new Person();
//		p.name = ""Class<?> personClass = Class.forName("com.qfedu.test1.Person");Field nameField = personClass.getDeclaredField("name");nameField.setAccessible(true); // 设置访问权限为true 表示忽略JVM非法访问异常System.out.println(nameField.getName() + nameField.getType());Object newInstance = personClass.newInstance();nameField.set(newInstance, "赵四");System.out.println(nameField.get(newInstance));}
}

3.获取方法

​ 方法的三要素:方法名,返回值列表,参数值列表

​ 确定一个方法的两要素:方法名,参数值列表

3.1 获取public修饰的,和继承自父类的 方法

getMethods() 获取本类所有public修饰的方法和继承父类的方法

getMethod() 获取单个的方法

package com.qfedu.test3;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class TestStudent {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {Class<?> studentClass = Class.forName("com.qfedu.test3.Student");Method[] methods = studentClass.getMethods();System.out.println(methods.length);for (Method method : methods) {System.out.println(method.getName());}Object newInstance = studentClass.newInstance();Method m1Method = studentClass.getMethod("m1");m1Method.invoke(newInstance);Method method = studentClass.getMethod("m1", String.class);method.invoke(newInstance, "赵四");Method method2 = studentClass.getMethod("m1", int.class);method2.invoke(newInstance, 330);Method method3 = studentClass.getMethod("m3", String.class,int.class);method3.invoke(newInstance, "赵四",22);}
}

3.2 获取本类中定义的方法

//获取单个本类中声明的方法。如果访问权限不足,可以使用此方法

getDeclaredMethod(String name,Class<?>…parameterTypes)

setAccessable(true);//暴力修改权限

getDeclaredMethods();// 获取所有本类中已定义的方法

package com.qfedu.test4;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class TestStudent {public static void main(String[] args) {try {Class<?> stuClass = Class.forName("com.qfedu.test4.Student");Method[] ms = stuClass.getDeclaredMethods();for (Method method : ms) {System.out.println(method.getName());}Object newInstance = stuClass.newInstance();Method m1 = stuClass.getDeclaredMethod("m1");m1.setAccessible(true); // 私有方法必须设置访问权限为truem1.invoke(newInstance);Method m2 = stuClass.getDeclaredMethod("m1", String.class);m2.invoke(newInstance, "赵四");Method m3 = stuClass.getMethod("m3", String.class,int.class);m3.invoke(newInstance, "广坤",20);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}}
}

4. 获取构造器

4.1 获取所有public修饰的构造器

​ constructor的作用:创建对象

getConstructors() 获取public修饰的构造方法

getConstructor(Class … type) 获取单个的构造器对象

package com.qfedu.test5;
/*** 	获取本类中定义的以public修饰的构造方法* @author WHD*/
public class Student {public String name;public int age;public String address;public Student() {System.out.println("Student类的无参构造");}public Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;System.out.println("三个参数的构造方法");}public Student(String name) {this.name = name;System.out.println("一个参数的构造方法");}public Student(String name, int age) {this.name = name;this.age = age;System.out.println("两个参数的构造方法");}
}
package com.qfedu.test5;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class TestStudent {public static void main(String[] args) {try {Class<?> stuClass = Class.forName("com.qfedu.test5.Student");Constructor<?>[] cs = stuClass.getConstructors();for (Constructor<?> c : cs) {System.out.println("名字" + c.getName() + "参数个数" + c.getParameterCount());}Constructor<?> constructor1 = stuClass.getConstructor();Object newInstance1 = constructor1.newInstance();Constructor<?> constructor2 = stuClass.getConstructor(String.class,int.class,String.class);Object newInstance2 = constructor2.newInstance("赵四",20,"象牙山");Constructor<?> constructor3 = stuClass.getConstructor(String.class);Object newInstance3 = constructor3.newInstance("广坤");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}
}

4.2 获取本类中定义的构造器

getDeclaredConstructors() 获取本类中定义的所有的构造方法

getDeclaredConstructor() 获取本类中单个的构造方法

package com.qfedu.test6;
/*** 	获取本类中定义的以public修饰的构造方法* @author WHD*/
public class Student {public String name;public int age;public String address;private Student() {System.out.println("Student类的无参构造");}Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;System.out.println("三个参数的构造方法");}protected Student(String name) {this.name = name;System.out.println("一个参数的构造方法");}public Student(String name, int age) {this.name = name;this.age = age;System.out.println("两个参数的构造方法");}
}
package com.qfedu.test6;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class TestStudent {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {Class<?> stuClass = Class.forName("com.qfedu.test6.Student");Constructor<?>[] cs = stuClass.getDeclaredConstructors();System.out.println(cs.length);Constructor<?> cons1 = stuClass.getDeclaredConstructor();cons1.setAccessible(true);Object newInstance1 = cons1.newInstance();}
}

5.jdk文件分析

5.1bin目录:

​ 执行文件javac、javadoc、Javaws、jcmd、jconsole、jdb控制台、jsadebugd、keytool生成证书

5.2 include:底层用的是C++写的

​ .h : C语言写的文件; win32 : 系统底层

5.3 jre:运行环境

5.4 lib : 包含jar包

​ Java.long、java.applet用于处理图形、fonts字体设置、security安全、Java核心jar包:rt.jar

6、获取类名

method.getName();//获取方法名

*Class.getName();//获取类名

String className = studentClass.getName();

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

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

相关文章

CodeGPT,你的智能编码助手—CSDN出品

CodeGPT是由CSDN打造的一款生成式AI产品&#xff0c;专为开发者量身定制。 无论是在学习新技术还是在实际工作中遇到的各类计算机和开发难题&#xff0c;CodeGPT都能提供强大的支持。其涵盖的功能包括代码优化、续写、解释、提问等&#xff0c;还能生成精准的注释和创作相关内…

redis 的安装

目录 关系数据库与非关系型数据库 关系型数据库 非关系型数据库 关系型数据库和非关系型数据库区别 非关系型数据库产生背景 总结 Redis概述 Redis 具有以下几个优点 使用场景 哪些数据适合放入缓存中 Redis为什么这么快 Redis 安装部署 Redis 命令工具 Redis 数…

Vue选择年的组件

代码&#xff1a; <div class"block"><span class"demonstration">年</span><el-date-pickerv-model"value3"type"year"placeholder"选择年"></el-date-picker> </div><script>…

win11 如何切换用户?

第1步&#xff1a;打开其他用户 第2步&#xff1a;添加账户 第3步&#xff1a; 使用新用户登录

鉴源论坛 · 观模丨浅谈Web渗透之信息收集(下)

作者 | 林海文 上海控安可信软件创新研究院汽车网络安全组 版块 | 鉴源论坛 观模 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 信息收集在渗透测试过程中是最重要的一环&#xff0c;“浅谈web渗透之信息收集”将通过上下两篇&#xff0c;对信息收集、…

Linux文件系统和日志分析

一、inode表结构 1. inode表 inode号在同一个设备上是唯一的。 inode号是有限资源&#xff0c;它的大小和磁盘大小有关。 访问文件的基本流程 根据文件夹的文件名和inode号的关系找到对应的inode表&#xff0c;再根据inode表&#xff08;属主 属组&#xff09;当中的指针找到磁…

基于STM32和MPU6050的自平衡小车设计与实现

基于STM32和MPU6050的自平衡小车设计和实现是一个有趣而具有挑战性的项目。在本文中&#xff0c;我们将介绍如何利用STM32微控制器和MPU6050传感器实现自平衡小车&#xff0c;并提供相应的代码示例。 1. 硬件设计 自平衡小车的核心硬件包括STM32微控制器、MPU6050传感器以及电…

【Spring 篇】深入浅出:用Spring注解开发的奇妙之旅

在编程的世界里&#xff0c;Spring框架如同一位慈祥的导师&#xff0c;为我们打开了无尽可能性的大门。而在Spring的广袤领域中&#xff0c;注解是我们最亲密的伙伴之一。本篇博客将深入浅出地介绍使用Spring注解进行开发的奇妙之旅&#xff0c;为你解开注解的神秘面纱。 前奏…

【读书笔记】《白帽子讲web安全》跨站脚本攻击

目录 前言&#xff1a; 第二篇 客户端脚本安全 第3章 跨站脚本攻击&#xff08;XSS&#xff09; 3.1XSS简介 3.2XSS攻击进阶 3.2.1初探XSS Payload 3.2.2强大的XSS Payload 3.2.2.1 构造GET与POST请求 3.2.2.2XSS钓鱼 3.2.2.3识别用户浏览器 3.2.2.4识别用户安装的软…

Qt 使用WINDOWS API读取SMBIOS信息,并通过CMD命令打印相关信息,参考DumpSMBIOS项目

在获取PE系统中的CPU、主板、内存信息时&#xff0c;发现使用WMI部分信息无法获取&#xff0c;通过gitGub上的DumpSMBIOS完全解决了这个问题&#xff0c;并单独做成了个案例&#xff0c;以下示例和代码都是参考DumpSMBIOS项目 SMBIOS这个数据还是用到的比较少。但是DumpSMBIOS项…

01.初识Python

初识Python Python简介 Python的历史 1989年圣诞节&#xff1a;Guido von Rossum开始写Python语言的编译器。1991年2月&#xff1a;第一个Python编译器&#xff08;同时也是解释器&#xff09;诞生&#xff0c;它是用C语言实现的&#xff08;后面&#xff09;&#xff0c;可…

【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第22套

少儿编程 蓝桥杯青少组科技素养题真题及解析第22套 1、植物的叶子多为绿色,这主要是因为它们含有 A、绿色色素 B、叶绿素 C、花青素 D、细胞 答案:B 考点分析:主要考查小朋友们生物知识的储备;叶绿素是植物叶子中的一种色素,它可以吸收太阳光中的能量并转化为植物所…

原子操作类原理剖析

UC包提供了一系列的原子性操作类&#xff0c;这些类都是使用非阻塞算法CAS实现的&#xff0c;相比使用锁实现原子性操作这在性能上有很大提高。 由于原子性操作类的原理都大致相同&#xff0c;所以只讲解最简单的AtomicLong类的实现原理以及JDK8中新增的LongAdder和LongAccumu…

理论U3 决策树

文章目录 一、决策树算法1、基本思想2、构成1&#xff09;节点3&#xff09;有向边/分支 3、分类步骤1&#xff09;第1步-决策树生成/学习、训练2&#xff09;第2步-分类/测试 4、算法关键 二、信息论基础1、概念2、信息量3、信息熵&#xff1a; 二、ID3 (Iterative Dichotomis…

[论文阅读]4DRadarSLAM: A 4D Imaging Radar SLAM System for Large-scale Environments

目录 1.摘要和引言&#xff1a; 2. 系统框架&#xff1a; 2.1 前端&#xff1a; 2.2 回环检测&#xff1a; 2.3 后端&#xff1a; 3.实验和分析&#xff1a; 4.结论 1.摘要和引言&#xff1a; 这篇论文介绍了一种名为“4DRadarSLAM”的新型4D成像雷达SLAM系统&#xff0…

若依CRUD搬砖开始,Java小白入门(十)

背景 经过囫囵吞枣的学习若依框架&#xff0c;对于ruoyi-framework&#xff0c;common&#xff0c;安全&#xff0c;代码生成等模块都看了一圈&#xff0c;剩余的调度模块&#xff0c;这个暂时不深入&#xff0c;剩余的是ruoyi-system&#xff0c;就是用mybatis完成的&#xf…

063:vue中一维数组与三维数组联动,类似购物车增减

第063个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使用,computed,watch,生命周期(beforeCreate,created,beforeM…

服务发现Discovery

对于注册进eureka里面的微服务&#xff0c;可以通过服务发现来获得该服务的信息 1、 修改cloud-provider-payment8001的controller import com.my.springcloud.utils.RestResponse; import com.my.springcloud.entities.Payment; import com.my.springcloud.service.PaymentSe…

K8S API访问控制之RBAC利用

前言 K8S对于API的访问安全提供了访问控制&#xff0c;主要为4个阶段&#xff0c;本文为第二个阶段——鉴权的RBAC。RBAC是基于角色的访问控制&#xff0c;使用kubeadm安装集群1.6版本以上的都默认开启了RBAC。本文主要研究集群可能存在的利用点及相对应的利用手法。 API访问…

【JAVA】final、finally、finalize 有什么区别?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 final&#xff1a; finally&#xff1a; finalize&#xff1a; 结语 我的其他博客 前言 在Java中&#xff0c;final、f…