8.5day06 框架基础--反射+注解

文章目录

  • 反射
    • 获取类的各种信息
      • 获取类的字节码文件
  • 注解
    • 元注解
  • 复习redis
  • 两道算法题

摆烂了,不想学啦!!!

反射

在这里插入图片描述
反射主要用来做框架;

学习内容

获取类的各种信息

第一步 加载类,获取类的字节码文件
第二步 获取类的构造器 (对象);
第三步 获取类的成员遍历 Field对象
第四步 获取类的成员方法,Method对象

获取类的字节码文件

1 类名.class 获取反射对象
2 调用Class提供的方法forname
3 通过object类提供的方法 getclass,要先有对象才能调用;

获取反射对象的三种方式

public class Test {public static void main(String[] args) throws NoSuchFieldException, ClassNotFoundException {//第一种方式Class c1=Student.class;System.out.println(c1.getName());
//        System.out.println(c1.getSimpleName());//  System.out.println(c1.getField(c1.getName()));//第二种方式Class c2=  Class.forName("反射.Student"); //会有异常,classNotFoundException类找不到异常System.out.println(c2.getName());//第三种Student student =new Student();Class c3= student.getClass();System.out.println(c3.getName());}
}

获取类的构造器,并对构造器进行操作
在这里插入图片描述

public class Test2 {public static void main(String[] args) throws NoSuchMethodException {Class C= Student.class;Constructor[] constructors = C.getConstructors();//构造器封装成数组for (Constructor constructor:constructors){System.out.println(constructor.getName()+ " 参数个数"+constructor.getParameterCount() );}Constructor declaredConstructor = C.getDeclaredConstructor();Constructor constructor=C.getConstructor(int.class,String.class);System.out.println(constructor.getName()+"参数个数"+constructor.getParameterCount());}
}

在这里插入图片描述
获取类的构造器的作用,初始化对象;
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在初始的时候可以指定泛型,后面就可以不用进行强转。
如何构造方法是private修饰的,需要设置setAccessible;

获取类的成员变量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以直接使用getName()等,这是为后面学习框架使用的。

获取类的成员方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package 反射;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;public class ObjectFrame {public  static  void saveObject(Object obj) throws Exception {PrintStream ps=new PrintStream(new FileOutputStream("src\\data.txt",true));Class c=   obj.getClass(); //得到传进来对象的字节码文件String cName=c.getSimpleName();ps.println("*-*******"+cName+"---------------------");Field[] fidlds = c.getDeclaredFields(); //得到的是字段for (Field field : fidlds) {field.setAccessible(true);//设置暴力访问String name = field.getName();//得到对应字段的名称String value=field.get(obj)+"";//得到对应字段的值,转为字符串ps.println(name+"="+value);}ps.close();}
}

在这里插入图片描述
通过反射读取信息。

注解

在这里插入图片描述
在这里插入图片描述
自定义注解
在这里插入图片描述
在这里插入图片描述

元注解

修饰注解的注解
在这里插入图片描述
常见的元注解
目标注解,在这里插入图片描述在这里插入图片描述
声明注解的周期

注解的解析
判断类上面、方法上面、成员变量上面是否存在注解,并把注解的内容解析出来

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注解开发的应用场景

配合反射的技术做框架的;
模拟简易版的junit框架
在这里插入图片描述

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test2 {@MyTestpublic  void test1(){System.out.println("test1");}public  void test2(){System.out.println("test2");}public  void test3(){System.out.println("test3");}@MyTestpublic  void test4(){System.out.println("test4");}public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {Test2 test2=new Test2();//实现启动程序Class c= Test2.class;Method[] declaredMethods = c.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {if (declaredMethod.isAnnotationPresent(MyTest.class)){declaredMethod.invoke(test2);}}}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {}

在这里插入图片描述
注解就是告诉别人需要干什么

复习redis

两道算法题

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

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

相关文章

IDEA基础使用

IDEA基础使用 1、IDEA中显示用法和用户截图展示有调用显示无调用显示 对应方法 2、如何找出项目中所有不被调用方法截图展示对应方法 3、常用代码(Code)说明及快捷键:4、未完待续待日后更新。。。总结:欢迎指导,也祝码友们代码越来越棒,技术越…

AMEYA360:瑞萨电子MCU和MPU产品线将支持Microsoft Visual Studio Code

全球半导体解决方案供应商瑞萨电子宣布其客户现可以使用Microsoft Visual Studio Code(VS Code)开发瑞萨全系列微控制器(MCU)和微处理器(MPU)。瑞萨已为其所有嵌入式处理器开发了工具扩展,并将其…

月报总结|Moonbeam 7月份大事一览

炎炎夏日,Moonbeam于越南举办了线下交流会,在EthCC 2023和以太坊社区成员共同讨论多链应用,在Polkadot Decoded中分享了Moonbeam的与众不同之处。 Bear Necessities Hackathon也于本月圆满结束,选出了每个赛道最杰出的项目&#…

CMake:检测python解释器和python库

CMake:检测python解释器和python库 导言检测python解释器CMakeLists.txt输出附录 检测python库项目结构CMakeLists.txt相关源码附录 导言 python是一种非常流行的语言。许多项目用python编写的工具,从而将主程序和库打包在一起,或者在配置或构建过程中使…

MCU的类型和应用领域简介

MCU(Microcontroller Unit)根据存储器类型可分为无片内ROM型和带片内ROM型。无片内ROM型的芯片需要外接EPROM才能应用,而带片内ROM型则有不同的子类型,如片内EPROM型、MASK片内掩模ROM型和片内Flash型。 MCU还可以按照用途分为通…

Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小

Cesium 实战教程 - 调整 3dtiles 倾斜摄影大小 核心代码完整代码在线示例 之前由于误解遇到一个特殊的需求:想要把三维球上叠加倾斜摄影进行自由放大缩小,跟随地图的缩放进行缩放。 后来经过搜索、尝试,终于实现了需求。 但是,后…

用Abp实现找回密码和密码强制过期策略

用户找回密码,确切地说是重置密码,为了保证用户账号安全,原始密码将不再以明文的方式找回,而是通过短信或者邮件的方式发送一个随机的重置校验码(带校验码的页面连接),用户点击该链接&#xff0…

SpringBoot 日志文件

一、日志的作用 日志是程序的重要组成部分,想象一下,如果程序报错了,不让你打开控制台看日志,那么你能找到报错的原因吗 答案是否定的,写程序不是买彩票,不能完全靠猜,因此日志对于我们来说&a…

C语言数组笔试题(详解)

目录 插入知识: 一.指向函数指针数组的指针 二.回调函数 什么是回调函数? 三.数组笔试题 个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生🐻‍❄个人主页:GOTXX &#x1f4…

【Apollo学习笔记】—— 相机仿真

文章目录 前言相关代码整理 测试实践文件目录包管理BUILD文件以及cyberfile.xml文件源程序BUILD运行结果其他参考CameraOutput channels启动camera驱动启动camera video compression驱动 前言 本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分&#xff0…

[迁移学习]领域泛化

一、概念 相较于领域适应,领域泛化(Domain generalization)最显著的区别在于训练过程中不能访问测试集。 领域泛化的损失函数一般可以描述为以下形式: 该式分为三项:第一项表示各训练集权重的线性组合,其中π为使该项最小的系数&a…

react工程化配置

道阻且长,行而不辍,未来可期 1.安装react yarn create react-app demo --template typescript cd demo yarn start2.配置蓝图模版 2.1安装blueprint插件 https://github.com/shredor/blueprint-templates-cli#readme yarn add blueprint-templates-c…

WAF绕过-漏洞利用篇-sql注入+文件上传-过狗

WAF绕过主要集中在信息收集,漏洞发现,漏洞利用,权限控制四个阶段。 1、什么是WAF? Web Application Firewall(web应用防火墙),一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

webpack基础知识六:说说webpack的热更新是如何做到的?原理是什么?

一、是什么 HMR全称 Hot Module Replacement,可以理解为模块热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用 例如,我们在应用运行过程中修改了某个模块,通过自动刷新会导致…

【C#学习笔记】装箱和拆箱

文章目录 装箱和拆箱性能消耗装箱拆箱 比较var&#xff0c;object&#xff0c;dynamic&#xff0c;\<T\>varobject\<T\> 泛型dynamic 装箱和拆箱 在讲引用类型object的时候&#xff0c;我们说它是万能的&#xff0c;却没说它万能在哪里。 除了object为每一种变量…

Grafana集成prometheus(4.Grafana添加预警)

上文已经完成了grafana对prometheus的集成及数据导入&#xff0c;本文主要记录grafana的预警功能&#xff08;以内存为例&#xff09; 添加预警 添加入口&#xff08;2个&#xff09; databorard面板点击edit&#xff0c;下方有个Alert的tab&#xff0c;创建Alert rules依赖…

ffmpeg + nginx 实现rtsp视频流转m3u8视频流,转码推流(linux)

FFmpeg即是一款音视频编解码工具&#xff0c;同时也是一组音视频编码开发套件&#xff0c;作为编码开发套件&#xff0c;它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg提供了多种媒体格式的封装和解封装&#xff0c;包括多种音视频编码、多种协议的流媒体、多种多彩格式…

苹果电脑第三方应用程序卸载工具CleanMyMacX4.14

CleanMyMacX&#xff0c;这是一款可以帮助你快速识别并卸载电脑上的多个应用程序的第三方工具&#xff0c;省去了逐个卸载的繁琐步骤。 我们首先要到下载CleanMyMacX&#xff0c; CleanMyMac X全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 然后&#xff0c…

【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程

文章目录 4.4网络模型OSI七层参考模型TCP/IP四层模型&#xff08;常用&#xff09;简介四层介绍 4.5协议简介常见协议UDP协议TCP协议IP协议以太网帧协议&#xff08;MAC地址封装&#xff09;ARP协议&#xff08;IP->MAC&#xff09; 4.6网络通信的过程封装分用 4.4网络模型 …

Stable Diffusion 硬核生存指南:WebUI 中的 GFPGAN

本篇文章聊聊 Stable Diffusion WebUI 中的核心组件&#xff0c;强壮的人脸图像面部画面修复模型 GFPGAN 相关的事情。 写在前面 本篇文章的主角是开源项目 TencentARC/GFPGAN&#xff0c;和上一篇文章《Stable Diffusion 硬核生存指南&#xff1a;WebUI 中的 CodeFormer》提…