干货分享之反射笔记

入门级笔记-反射

  • 一、利用反射破泛型集合
  • 二、Student类
  • 三、获取构造器的演示和使用
    • 1.getConstructors只能获取当前运行时类的被public修饰的构造器
    • 2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器
    • 3.获取指定的构造器
      • 3.1得到空构造器
      • 3.2得到两个参数的有参构造器:
      • 3.3得到一个参数的有参构造器:并且是private修饰的
    • 4.有了构造器以后我就可以创建对象
  • 四、获取属性的演示和使用:
    • 1.getFields:获取运行时类和父类中被public修饰的属性
    • 2.getDeclaredFields:获取运行时类中的所有属性
    • 3.获取指定的属性:
    • 4.属性的具体结构
      • 4.1获取修饰符
      • 4.2获取属性的数据类型:
      • 4.3获取属性的名字:
      • 4.4给属性赋值:(给属性设置值,必须要有对象)
  • 五、获取方法的演示与应用
    • 1.getMethods:获取运行时类的方法还有所有父类中的方法(被public修饰)
    • 2.getDeclaredMethods:获取运行时类中的所有方法:常用!!!!!
    • 3.获取指定的方法:
    • 4.调用方法:
  • 六、获取运行时类的接口
  • 总结


一、利用反射破泛型集合

public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {//用反射来破泛型集合/*** 泛型集合:限制存入集合中的变量类型* 但是这种限制,只出现在编码/编译期。* 运行期是没有泛型;反射,恰好就是在运行期执行*/ArrayList<String> list = new ArrayList<>();list.add("123");Class cls = ArrayList.class;Method add = cls.getMethod("add", Object.class);add.invoke(list,34);add.invoke(list,false);System.out.println(list);//运行期无泛型}

运行结果:
在这里插入图片描述



二、Student类

public class Student extends Person implements MyInterface {private int sno;//学号double height;//身高protected double weight;//体重public double score;//成绩public String banji;public String showInfo(){return "我是一名三好学生";}public String showInfo(int a,int b){return "重载方法====我是一名三好学生";}private void work(){System.out.println("我以后会找工作-->成为码农 程序员 程序猿 程序媛");}void happy(){System.out.println("做人最重要的就是开心每一天");}protected int getSno(){return sno;}@Overridepublic void myMethod() {System.out.println("我重写了myMethod方法。。");}public Student() {}public Student(int sno) {this.sno = sno;}public Student(int sno, double weight) {this.sno = sno;this.weight = weight;}private Student(double height) {this.height = height;}public Student(int sno, double height, double weight, double score) {this.sno = sno;this.height = height;this.weight = weight;this.score = score;}@Overridepublic String toString() {return "Student{" +"sno=" + sno +", height=" + height +", weight=" + weight +", score=" + score +'}';}
}


三、获取构造器的演示和使用

//获取字节码信息:Class cls = Student.class;//通过字节码信息可以获取构造器:

1.getConstructors只能获取当前运行时类的被public修饰的构造器

代码如下(示例):

Constructor[] c1 = cls.getConstructors();for(Constructor c:c1){System.out.println(c);}

运行结果:
在这里插入图片描述

2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器

代码如下(示例):

Constructor[] c2 = cls.getDeclaredConstructors();for(Constructor c:c2){System.out.println(c);}

运行结果:
在这里插入图片描述

3.获取指定的构造器

3.1得到空构造器

Constructor con1 = cls.getConstructor();System.out.println(con1);

运行结果:
在这里插入图片描述

3.2得到两个参数的有参构造器:

Constructor con2 = cls.getConstructor(int.class, double.class);System.out.println(con2);

运行结果:
在这里插入图片描述

3.3得到一个参数的有参构造器:并且是private修饰的

Constructor con3 = cls.getDeclaredConstructor(int.class);System.out.println(con3);

运行结果:
在这里插入图片描述

4.有了构造器以后我就可以创建对象

Object o1 = con1.newInstance();System.out.println(o1);Object o2 = con2.newInstance(180120111, 170.6);System.out.println(o2);

运行结果:
在这里插入图片描述



四、获取属性的演示和使用:

//获取字节码信息Class cls = Student.class;

1.getFields:获取运行时类和父类中被public修饰的属性

Field[] fields = cls.getFields();for(Field f:fields){System.out.println(f);}

运行结果:
在这里插入图片描述

2.getDeclaredFields:获取运行时类中的所有属性

Field[] declaredFields = cls.getDeclaredFields();for(Field f:declaredFields){System.out.println(f);}

运行结果:
在这里插入图片描述

3.获取指定的属性:

Field score = cls.getField("score");System.out.println(score);Field sno = cls.getDeclaredField("sno");System.out.println(sno);

运行结果:
在这里插入图片描述

4.属性的具体结构

4.1获取修饰符

//获取指定的属性:Field score = cls.getField("score");System.out.println(score);Field sno = cls.getDeclaredField("sno");System.out.println(sno);System.out.println("---------------------");
//        //属性的具体结构:
//        //获取修饰符/*int modifiers = sno.getModifiers();System.out.println(modifiers);System.out.println(Modifier.toString(modifiers));*/System.out.println(Modifier.toString(sno.getModifiers()));

运行结果:
在这里插入图片描述
这里先要获取到一个属性,再去获取属性的修饰符

4.2获取属性的数据类型:

Class clazz = sno.getType();System.out.println(clazz.getName());System.out.println("---------------------");

运行结果:
在这里插入图片描述
这里要接着上面的写

4.3获取属性的名字:

String name = sno.getName();System.out.println(name);System.out.println("-------------------------------");

运行结果:
在这里插入图片描述

4.4给属性赋值:(给属性设置值,必须要有对象)

Field sco = cls.getField("score");Object obj = cls.newInstance();sco.set(obj,98);//给obj这个对象的score属性设置具体的值,这个值为98System.out.println(obj);

运行结果:
在这里插入图片描述



五、获取方法的演示与应用

//获取字节码信息Class cls = Student.class;

1.getMethods:获取运行时类的方法还有所有父类中的方法(被public修饰)

Method[] methods = cls.getMethods();for(Method m:methods){System.out.println(m);}System.out.println("-----------------------");

运行结果:
在这里插入图片描述

2.getDeclaredMethods:获取运行时类中的所有方法:常用!!!!!

Method[] declaredMethods = cls.getDeclaredMethods();for(Method m:declaredMethods){System.out.println(m);}System.out.println("-----------------------");

运行结果:
在这里插入图片描述

3.获取指定的方法:

Method showInfo1 = cls.getMethod("showInfo");System.out.println(showInfo1);Method showInfo2 = cls.getMethod("showInfo", int.class, int.class);System.out.println(showInfo2);Method work = cls.getDeclaredMethod("work");work.setAccessible(true);//!!!这里是个重点暴力破拆私有--调用.setAccessible方法System.out.println(work);System.out.println("-----------------------");

运行结果:
在这里插入图片描述

4.调用方法:

 Object o = cls.newInstance();myMethod.invoke(o);//调用o对象的mymethod方法work.invoke(o);//调用o对象的work方法

运行结果:
在这里插入图片描述



六、获取运行时类的接口

 public static void main(String[] args) {//获取字节码信息:Class cls = Student.class;//获取运行时类的接口:Class[] interfaces = cls.getInterfaces();for(Class c:interfaces){System.out.println(c);}//得到父类的接口://先得到父类的字节码信息:Class superclass = cls.getSuperclass();//得到接口:Class[] interfaces1 = superclass.getInterfaces();for(Class c:interfaces1){System.out.println(c);}//获取运行时类所在的包:Package aPackage = cls.getPackage();System.out.println(aPackage);System.out.println(aPackage.getName());//获取运行类的注解:Annotation[] annotations = cls.getAnnotations();for(Annotation a:annotations){System.out.println(a);}}

运行结果:
在这里插入图片描述


总结

以上就是今天要分享的内容,干货满满,其中有一个重点!在获取指定的私有方法时候,暴力破拆私有的权限,要不然后面调用这个方法会报错,利用.setAccessible(true)方法实现,看完了的话点个收藏吧,防止用的时候找不到。

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

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

相关文章

Vue2(十一):全局事件总线、消息订阅与发布pubsub、TodoList的编辑功能、$nextTick、过渡与动画

一、全局事件总线 1、思路解析 一种组件间通信的方式&#xff0c;适用于任意组件间通信。通俗理解就是一个定义在所有组件之外的公共x&#xff0c;这个x可以有vm或vc上的同款$on、$off、$emit&#xff0c;也可以让所有组件都访问到。 第一个问题&#xff1a;那怎样添加这个x才…

自省式RAG 与 LangGraph的实践

自省式 RAG 对实现 RAG 的步骤进行逻辑分析&#xff1a;比如&#xff0c;我们需要知道什么时候进行检索&#xff08;基于问题和索引的构成&#xff09;、何时改写问题以提升检索效率&#xff0c;或者何时抛弃无关的检索结果并重新检索。因此提出了自省式 RAG&#xff0c;自省式…

【面经八股】搜广推方向:面试记录(十)—最近的一些面试汇总

【面经&八股】搜广推方向:面试记录(十)—最近的一些面试汇总 文章目录 【面经&八股】搜广推方向:面试记录(十)—最近的一些面试汇总0. AB1. 编程1.1 大数加减法1.2 树的序列化与反序列化1.3 手写 kmeans 聚类1.4 二叉树的前中后序遍历(非递归实现)2. 感觉这个经…

[医学分割大模型系列] (3) SAM-Med3D 分割大模型详解

[医学分割大模型系列] -3- SAM-Med3D 分割大模型解析 1. 特点2. 背景3. 训练数据集3.1 数据集收集3.2 数据清洗3.3 模型微调数据集 4. 模型结构4.1 3D Image Encoder4.2 3D Prompt Encoder4.3 3D mask Decoder4.4 模型权重 5. 评估5.1 评估数据集5.2 Quantitative Evaluation5.…

【详细讲解yarn的安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

题目:用*号输出字母C的图案。

题目&#xff1a;用*号输出字母C的图案。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should lea…

面向对象【Annotation注解】

文章目录 注解概述注解与注释常见的 Annotation最基本的注解使用@Override@Override@SuppressWarnings元注解@Retention@Target@Documented@Inherited自定义注解格式定义使用注解概述 注解(Annotation)是从 JDK5.0 开始引入,以“@注解名”在代码中存在。例如: @Override @D…

Git入门(Git快速下载,安装,配置,远程仓库,本地仓库,IDEA提交代码,VScode提交代码使用方案一体)

Git快速下载 通过阿里镜像可以自由挑选版本并快速下载CNPM Binaries Mirrorhttp://npm.taobao.org/mirrors/git-for-windows/ 这里安装最新版本 下载安装文件 安装完后双击文件即可开始安装git 安装 git的安装傻瓜式Next即可 配置 打开git&#xff1a;桌面空白处右击&#…

JVM(四)——编译期的处理

编译期处理(语法糖) 所谓的语法糖 &#xff0c;其实就是指 java 编译器把 *.java 源码编译为 *.class 字节码的过程中&#xff0c;自动生成 和转换的一些代码&#xff0c;主要是为了减轻程序员的负担。大多数是在 jdk5 及 jdk7 做的处理。 1&#xff09;默认构造器 创建一个…

SolidWorks教育版本的优势是什么

随着工程设计和制造技术的不断进步&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件在教育领域的应用越来越广泛。SolidWorks教育版本作为一款专为教育机构和学生设计的三维CAD软件&#xff0c;具有许多明显的优势。本文将探讨SOLIDWORKS教育版本的主要优势&#xf…

谁再问你数据库三范式,这篇文章甩给他!!!

前几天有粉丝私信说面试被问到了数据库三范式&#xff08;面试问这种的不去也好&#xff09;&#xff0c;今天我们就来聊聊。在数据库设计的过程中&#xff0c;为了确保数据的准确性和完整性&#xff0c;我们通常遵循一定的规则和标准&#xff0c;其中最为人所熟知的便是“数据…

linux文本三剑客 --- grep、sed、awk

1、grep grep&#xff1a;使用正则表达式搜索文本&#xff0c;将匹配的行打印出来&#xff08;匹配到的标红&#xff09; 命令格式&#xff1a;grep [option] pattern file <1> 命令参数 -A<显示行数>&#xff1a;除了显示符合范本样式的那一列之外&#xff0c;并…

类,并快乐着---python中的类

类&#xff0c;并快乐着---python中的类 争取让你获取类的快乐&#xff01;\ 在Python中&#xff0c;类是一种用来创建对象的蓝图或模板。类定义了对象的属性和方法&#xff0c;可以通过类来创建多个对象实例。 所谓类&#xff0c;并快乐着。让你欲罢不能。 下面是Python中类…

MongoDB 的索引有哪些 nestjs mongoose示例

MongoDB 的索引有哪些 nestjs mongoose示例 复合索引&#xff08;Compound Index&#xff09;&#xff1a; 索引多个字段&#xff0c;允许对这些字段的组合进行高效查询。例如&#xff0c;您可以创建一个索引 { name: 1, age: 1 }&#xff0c;以便可以快速查询按姓名和年龄排序…

解不开的心结就让他系成蝴蝶结吧!

解不开的心结&#xff0c;就让它变成蝴蝶结吧 生活中&#xff0c;我们都会遇到一些难以解开的心结。它们像一块块绊脚石&#xff0c;让我们在前进的路上跌跌撞撞。面对这些心结&#xff0c;我们往往陷入了深深的思考和无尽的纠结。但是&#xff0c;有没有一种更优雅、更积极的…

【C语言】鸡兔同笼,鸡和兔共 100 只,共 284 只脚,求鸡和兔的个数。

鸡兔同笼&#xff0c;鸡和兔共 100 只&#xff0c;共 284 只脚&#xff0c;求鸡和兔的个数。 int main() {for (int i 0; ; i){if (2 * i 4 * (100 - i) 284){printf("鸡的数量&#xff1a;%d,兔子的数量&#xff1a;%d", i, 100 - i);break;} } }这里直接算出题…

开源博客项目Blog .NET Core源码学习(11:App.Core项目结构分析)

开源博客项目Blog的App.Core项目主要定义数据库表对应的数据类&#xff0c;同时定义配置文件读取、日志记录、辅助缓存等辅助类。App.Core项目安装的Nuget包不多&#xff0c;仅包括SqlSugarCore和Microsoft.Extensions.DependencyInjectio两类。   App.Core项目的顶层文件夹如…

Git本地项目开发流程记录

背景 基于Git Bash本地创建项目&#xff0c;了解Git项目开发的基本流程&#xff0c;便于管理和记录算法开发流程&#xff0c;规范代码结构。相关概念 Git分区&#xff1a;工作区&#xff0c;缓存区&#xff0c;版本区。工作区即代码开发的本地文件&#xff0c;缓存区为使用Git …

TouchGFX之Drawable

TouchGFX框架中的所有控件均为Drawable类的子类。 该类别包含控制大小和位置的一般方法。 #ifndef TOUCHGFX_DRAWABLE_HPP #define TOUCHGFX_DRAWABLE_HPP #include <touchgfx/Bitmap.hpp> #include <touchgfx/events/ClickEvent.hpp> #include <touchgfx/event…

AI智能客服:引领企业客户服务新篇章

AI智能客服&#xff1a;高效处理客户咨询的新选择 AI智能客服能够自动识别客户的语音或文字信息&#xff0c;通过自然语言处理技术理解其意图和需求&#xff0c;并快速给出准确的回答或建议。无论是常见的产品查询、订单状态确认&#xff0c;还是复杂的投诉建议&#xff0c;AI…