第16章Java

通过java的反射机制,程序员可以更深入的控制程序的运行过程。例如,可在程序运行时对象用户输入的信息进行验证,还可以逆向控制程序的执行过程,讲解了反射,另外java还提供了Annotation注解功能,该功能建立在反射机制的基础上,包括定义Annotation类型的方法和程序运行时访问Anntation信息的方法

 d7854388fddd4c2e807e761a664969a4.png

 16.1反射

通过java反射机制,可以在程序中访问以及装载到JVM中的java对象的描述实现方法。检查喝修改描述java对象本身的信息的功能 java反射机制功能十分强大,在java.lang.reflect包中提供了该功能的支持

众所周知,所有jvaa类俊继承了Object类在Object类中定义了一个getClass()方法 该方法返回了一个类信息为Class的对象  代码如下:

 
  1. demo1 d1 = new demo1();

  2. Class c1 = d1.getClass();//先new一个对象然后使用getClass方法来获取

  3. //第二种方法

  4. Class c2= demo1.class;

  5. 第三种方法直接使用forName方法来获取 其中括号内传入的时包名和类名

  6. Class c3= Class.forName("com.cr.demo1");

利用Class类的对象demo1,可以访问用来返回该对象的demo1对象的描述信息,可以访问的主要描述信息如下

组成部分访问方法返回值类型说明
包路径getPackage()Package对象获取该类的存放路径
类名称getName()String对象获取该类名称
继承类getSuperclassClass对象获取该类的继承类
实现接口getInterfaces()Class型数组获取该类实现的所有接口
构造方法getConstructors()Constructor型数组获取所有权限为public的构造方法
getConstructor(Class<?>...parameterTypers)Constructor对象获取指定构造方法
getDeclaredConstructors()Constructor型数组获取所有构造方法
getDeclaredConstructors(Class<?>...parameterTypers)Constructor对象获取自动那个构造方法
方法getMethods()Method型数组获取所有权限为public的指定方法

getMethod(String name,Class<?>...parameterTypes)

Method对象获取权限为public的指定方法
getDeclardMethod()Method型数组获取所有方法
getDeclaredMethod(String name,Class<?>...parameterTypes)Method对象获取指定方法
成员变量getFields()Field数组获取所有权限为public的成员变量
getFields(String name)Field对象获取权限为public的指定的成员变量
getDeclaredFields()Field数组获取所有成员变量
getDeclaredField(String name)Field对象获取指定成员变量
内部类getClasses()Class型数组获取所有权限为public的内部类
getDeclaredClasses()Class型数组获取所有内部类
内部类的声明类getDeclaringClass()Class对象如果改类为内部类,则返回她的成员变量否则返回null

 如上代码的使用方法如下代码所示:

 
  1. package com.cr;

  2.  
  3. import java.lang.reflect.Constructor;

  4. import java.lang.reflect.Field;

  5. import java.lang.reflect.Method;

  6. import java.lang.reflect.Parameter;

  7.  
  8. public class classdemo {

  9.  
  10. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, NoSuchFieldException {

  11. demo1 d1 = new demo1();

  12. Class c1 = d1.getClass();

  13. Class c2= demo1.class;

  14. Class c3= Class.forName("com.cr.demo1");

  15. System.out.println(c2.getName());

  16. System.out.println(c2.getPackageName());

  17. //获取构造方法

  18. Constructor[] cs = c2.getConstructors();

  19. Constructor c = c2.getConstructor(String.class);

  20. System.out.println(c.getName());

  21. Parameter[] p = c.getParameters();

  22. //获取成员变量

  23. Field[] fs = c2.getFields();

  24. Field f = c2.getDeclaredField("i");

  25. System.out.println(f.getName());

  26. //获取成员方法

  27. Method[] ms =c2.getMethods();

  28. Method m = c2.getMethod("getStr", null);

  29. System.out.println(m.getName());

  30. m.getExceptionTypes();//获取所有异常

  31. }

  32.  
  33. }

内置注解

内置注解有三种

以下三种代码都不会影响我们代码的正常运行  是写个编译器看的  

@Override限定重写父类方法  作用范围使用在成员方法上

@SuppresWarnings(警告)抑制编译器警告//作用范围类成员属性  成员方法

@Deprecated 标识已经过时//作用范围类成员属性  成员方法

自定义注解

在定义Annotation类型时,也需要用到来i当以的interface关键字,但需要在interface关键字前加一个@符号,即定义Annotation类型的关键字@interface,这个关键字的隐含意思是继承java.lang.annotation.Annotation接口.如下:

 
  1. public @interface demo{

  2. }

枚举类中ElementType中的枚举常量使用方法如下所示:

 
  1. package com.cr;

  2. //注解类

  3. import java.lang.annotation.ElementType;

  4. import java.lang.annotation.Retention;

  5. import java.lang.annotation.RetentionPolicy;

  6. import java.lang.annotation.Target;

  7.  
  8. @Retention(value =RetentionPolicy.RUNTIME )//在源码时生效

  9. @Target(value = {ElementType.CONSTRUCTOR,ElementType.FIELD ,ElementType.METHOD,ElementType.TYPE })

  10. //设置什么方法可以使用 如:ElementType.CONSTRUCTOR是构造方法 FIELD 适用于成员变量和枚举常量 METHOD用于方法 TYPE是用于类和接口枚举 Annotation类型

  11. public @interface MyAnnotation {

  12. String value()default"田";

  13. int i ()default 8;

  14. }

  15. package com.cr;

  16.  
  17. @MyAnnotation(i = 5, value = "联系类")//给某给类注解 //想要给成员变量或者普通方法注解的话 需要把@MyAnnotation放在他的上一行

  18. public class demo {

  19. @MyAnnotation

  20. String str;

  21. @MyAnnotation

  22. public String getStr() {

  23. return str;

  24. }

  25. }

访问Annotation信息

如果在定义Annotation类型时讲@Retention设置为RetentionPollcy.RUNTIME,那么在运行程序时,通过反射就可以获取相关的Annotation信息 ,如获取构造方法,字段和方法Annotation信息。

Cpmstructor类Field和Method类均继承了isAccessibleObject类,在AccessibleObject中定义了3个关于Annotation的放啊,其中,方法发isAnnotationPresent(Class<?extends Annotation>AnnotationClass)用来查看是否添加了指定类型的Annotation,如果是则返回true 否则返回false;方法getAnnotation(Class<T>AnnotationClass)用来获取指定类型的Annotation如果存在则返回相应的对象,则返回null方法getAnnotations()用来获取所有的Annotation改方法将返回Annotation数组

在constructor类和Method类中还定义了getParameterAnnotations()用来获得所有参数添加Annotation,将以Annotation可u下的二位数组返回,在数组中的素和顺序与声明的顺序相同。如果没有参数则返回一个长度为0的数组,如果存在未添加的Annotation的参数将用一个长度为0的嵌套数组占位

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用cmake配置matplotlibcpp生成VS项目

https://gitee.com/feboreigns/matplotlibcpp 这篇文章需要一些cmake基础&#xff0c;python基础&#xff0c;visualstudio基础 准备环境 注意如果在VS平台使用必须要手动下载python&#xff0c;不能使用conda里面的&#xff0c;比如3.8版本&#xff0c;因为conda里面没有py…

SuperMap Hi-Fi 3D SDK for Unity矢量面贴地贴模型

作者&#xff1a;kele 一、背景 SuperMap Hi-Fi 3D SDK&#xff08;2023 11i&#xff09; for Unity推出新功能&#xff1a;支持矢量面同时贴地形图层和模型图层&#xff0c;并且能实现数据点击查询属性、更改初始填充颜色、初始边框线颜色、选中填充颜色、选中边框线颜色、控…

如何本地部署Nextcloud结合cpolar搭建专属私有云盘远程访问(内网穿透)

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

基于ssm教务管理系统论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

代码随想录-刷题第三十九天

动态规划理论基础 动态规划的题目由重叠子问题构成&#xff0c;每一个状态一定是由上一个状态推导出来的。这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。 动态规划五步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义…

计算机毕业设计---ssm+mysql+jsp实现的校园二手市场交易平台源码

项目介绍 本系统主要实现的功能有&#xff1a; 前台&#xff1a;&#xff08;1&#xff09;二手物品信息查看、搜索。 &#xff08;2&#xff09;学生注册登录、个人信息修改。 &#xff08;3&#xff09;二手物品信息发布、编辑。 &#xff08;4&#xff09;二手物品评论、回…

JAVA——JDBC学习

视频连接&#xff1a;https://www.bilibili.com/video/BV1sK411B71e/?spm_id_from333.337.search-card.all.click&vd_source619f8ed6df662d99db4b3673d1d3ddcb 《视频讲解很详细&#xff01;&#xff01;推荐》 JDBC&#xff08;Java DataBase Connectivity Java数据库连…

windows进行udp端口转发,解决项目中服务器收不到组播数据的问题

说明 windows7的netsh interface portproxy命令只支持tcp端口转发 如果要进行udp端口转发可以使用sokit 运行sokit 端口转发&#xff08;以为tcp作为讲解&#xff0c;udp类似&#xff09; 选择转发器 输入监听地址&#xff08;SRC地址&#xff09;和端口 输入转发地址&am…

网络安全 :保护数字世界的壁垒

随着数字化时代的到来&#xff0c;网络安全变得越来越重要。本文介绍了网络安全的定义&#xff0c;探讨了网络安全的重要性以及网络安全的解决方案&#xff0c;包括身份验证、防火墙、加密等技术&#xff0c;以确保数字世界的安全。 随着互联网的蓬勃发展&#xff0c;数字化技术…

Download Monitor Email Lock下载监控器邮件锁插件

打开Download Monitor Email Lock下载监控器邮件锁插件 Download Monitor Email Lock下载监控器邮件锁插件下载监视器的电子邮件锁定扩展允许您要求用户在获得下载访问权限之前填写他们的电子邮件地址。 Download Monitor Email Lock下载监控器邮件锁插件用法 安装扩展程序后…

【Vulnhub 靶场】【Hms?: 1】【简单】【20210728】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hms-1,728/ 靶场下载&#xff1a;https://download.vulnhub.com/hms/niveK.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月28日 文件大小&#xff1a;2.9 GB 靶场作者&#xff1a;niveK 靶场系…

canal 数据同步组件

canal 数据异构组件 为啥要使用这个组件&#xff1f; 在更新DB的时候不同步更新到redis&#xff0c;es等数据库中&#xff0c;时间太久&#xff0c;而且可能会存在同步失败的问题&#xff0c;因此引入canal去拉取DB的数据&#xff0c;再去更新到redis&#xff0c;es等数据库中&…

LED驱动升降压芯片的多种应用方案,实现产品多样化需求-FP7195

目录 FP7195LED驱动降压恒流型 FP7195驱动升压恒流型 FP7195-升降压恒流型驱动方式 FP7195-升降压恒流型驱动方式-高压版 FP7195LED驱动是一种广泛应用于LED照明产品中的驱动器&#xff0c;为了满足不同客户对于产品性能和功能的要求&#xff0c;该驱动器提供了四种不同的方…

Go 中有效并发的模式

设计高效可靠的并发系统 在现代软件开发领域中&#xff0c;利用并发的能力已经变得至关重要。随着应用程序的复杂性增加和数据处理需求的增长&#xff0c;编写既高效又可靠的并发代码成为了一个重要的关注点。为了解决这个挑战&#xff0c;开发者们已经制定了一些模式和最佳实…

java freemarker 动态生成excel文件

好久木有更新啦 抓住2023的小尾巴 浅浅更新一下吧~ 最近做了一个动态生成excel的功能&#xff0c;这里记录下部分功能&#xff0c;主要用到的是freemarker框架&#xff0c;spring就有带&#xff0c;我起的demo载入了一下freemarker的jar包 一、创建模板 首先可以创建一个e…

百度每天20%新增代码由AI生成,Comate SaaS服务8000家客户 采纳率超40%

12月28日&#xff0c;由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023在北京召开。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰现场公布了飞桨文心五载十届最新生态成果&#xff0c;文心一言最新用户规模破1亿&#xff0c;截…

idea中切换JDK8、JDK11、JDK17

有时候&#xff0c;我们可能需要在不同的Java版本中去测试或者查看源码&#xff0c;idea可以让我们修改Java的版本。 前提&#xff1a;你必须下载安装好对应的Java版本&#xff0c;可参考文章【windows下切换JDK8、JDK11、JDK17】&#xff08;https://blog.csdn.net/xijinno1/a…

九九乘法表c 语言 用于打印九九乘法表

以下是一个简单的C语言程序&#xff0c;用于打印九九乘法表&#xff1a; #include <stdio.h>int main() {int i, j;for (i 1; i < 9; i) {for (j 1; j < i; j) {printf("%d*%d%-2d ", j, i, i*j);}printf("\n");}return 0; }解释&#xff1…

快速上手makefile自动化构建工具

makefile自动化构建工具 文章目录 makefile自动化构建工具 makefile背景 简单认识makefile 依赖关系与依赖方法 生成项目 清理项目 ACM时间 语法补充 .PHONY修饰 特殊符号替换 Makefile的推导过程 总结 前言&#xff1a; 在windows下&#xff0c;很多东西都是编译器直接帮你做…

im6ull学习总结(二)Framebuffer 应用编程

1 LCD操作原理 linux中通过framebuffer驱动程序来控制LCD。framebuffer中包含LCD的参数&#xff0c;大小为LCD分辨率xbpp。framebuffer 是一块内存 内存中保存了一帧图像。 关于图像的帧指的是在图像处理中&#xff0c;一帧&#xff08;Frame&#xff09;是指图像序列中的单个…