第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的嵌套数组占位

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

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

相关文章

PYTHON基础:线性算法--线性回归|岭回归|套索回归模型

常用的三种线性模型算法–线性回归模型、岭回归模型、套索回归模型 线性模型基本概念 线性模型的一般预测模型是下面这个样子的&#xff0c;一般有多个变量&#xff0c;也可以称为多个特征x1、x2、x3 … 最简单的线性模型就是一条直线直线的方程式&#xff0c;b0是截距&#…

vue3 根据用户权限控制左侧菜单和路由拦截

目录 前言 整体思路 详细开发 1.左侧菜单的显隐控制 2.控制路由权限 补充权限控制 总结 前言 我这里是vue3开发的一个后台管理系统&#xff0c;所以涉及用户权限管理&#xff0c;以及页面权限等&#xff0c;其他模块部分可以查看专栏&#xff0c;这里只对怎么实现根据用…

[Redis实战]优惠券秒杀

三、优惠券秒杀 3.1 全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这种表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显受单表数据量的限制 场景分析一&…

Word2Vec详解: CBOW Skip-gram和负采样

Word2Vec&#xff1a; CBOW & Skip-gram 如果是拿一个词语的上下文作为输入&#xff0c;来预测这个词语本身&#xff0c;则是 CBOW 模型。 而如果是用一个词语作为输入&#xff0c;来预测它周围的上下文&#xff0c;那这个模型叫做 Skip-gram 模型。 CBOW 模型 连续词袋模…

简单实现一个自定义loader

webpack定义的loader需要遵循单一功能原则&#xff0c;也就是一个loader只实现一个功能。在实现开发中&#xff0c;我们会直接使用诸如蓝湖等生成的样式&#xff0c;比如 button{background: rgb(255, 85, 46); }但为了考虑主题换肤&#xff0c;我们实现的想要的可能是 butto…

在用Vite开发时静态图片放哪里,才能保证显示,不出现找不到资源

在用Vite开发时静态图片放哪里 在用Vite开发时静态图片&#xff08;资源&#xff09;放哪里呢 &#xff1f; 如果你想直接全部显示的那么请你把静态资源放到public目录下面&#xff0c;这样你一打包所有的静态资源都会放到打包根目录下。但是此时你在项目中引用的地址一定要是…

(2)llvm解析器和抽象语法树

解析器的输出是抽象语法树 对于数字字面量&#xff0c;创造了一个实例&#xff0c;并捕捉 变量捕捉函数名&#xff1b;二元表达式捕捉运算符&#xff1b;函数调用捕捉函数名和函数调用参数 函数原型和函数定义 构建语法树 getNextToken会从输入流里拿一个token&#xff0c;Cur…

克魔助手:方便查看iPhone应用实时日志和奔溃日志工具

查看ios app运行日志 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具&#xff0c;该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和奔溃日志。同时还提供了奔溃日志分析查看模块&#xff0c;可以对苹果奔溃日志进行符号化、格式化和分析&#xff0c;极…

MSVC++ 编译 module std

环境&#xff1a;windows 10 19045.xxxx 只安装了MSVC C 工具链和一个版本的SDK&#xff0c;SDK版本建议选一个和本机系统匹配的。 cd %USERPROFILE%\source\repos\STLModules mkdir x86 mkdir x64 打开“x86 Native Tools Command Prompt for VS 2022”控制台&#xff0c;…

【mac-m1 docker 安装upload-labs靶场】

1.搜索upload-labs docker search upload-labs 2.下载upload-labs docker pull c0ny1/upload-labs 3.启动 docker run -it -d --name uploadlabs -p 80:80 c0ny1/upload-labs --platform linux/amd64 4.访问127.0.0.1:80

java设计模式学习之【备忘录模式】

文章目录 引言备忘录模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用备忘录示例代码地址 引言 想象一下&#xff0c;你正在编辑一篇重要的文档&#xff0c;突然你意识到最近的一些更改实际上破坏了文档的结构。幸运的是&#xff0c;你的文本编辑器允许你撤…

哈希桶的模拟实现【C++】

文章目录 哈希冲突解决闭散列 &#xff08;开放定址法&#xff09;开散列 &#xff08;链地址法、哈希桶&#xff09;开散列实现&#xff08;哈希桶&#xff09;哈希表的结构InsertFindErase 哈希冲突解决 闭散列 &#xff08;开放定址法&#xff09; 发生哈希冲突时&#xf…

【MyBatis-Plus】进阶之乐观锁、悲观锁逻辑删除分页和查询构造器的使用

目录 一、乐观锁、悲观锁 1、什么是乐观锁和悲观锁 ①乐观锁&#xff08;Optimistic Locking&#xff09;: ②悲观锁&#xff08;Pessimistic Locking&#xff09;: ③实现方式 2、乐观锁和悲观锁的区别 ①乐观锁&#xff08;Optimistic Locking&#xff09; ②悲观锁&…

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

消息队列基础知识

学一点&#xff0c;整一点&#xff0c;基本都是综合别人的&#xff0c;弄成我能理解的内容 https://blog.csdn.net/BenJamin_Blue/article/details/125946812 https://blog.csdn.net/qq_46119575/article/details/129794304 &#x1f4cc;导航小助手&#x1f4cc; 生产者-消费者…

【C语言】初识C语言

本章节主要目的是基本了解C语言的基础知识&#xff0c;对C语言有一个大概的认识。 什么是C语言 在日常生活中&#xff0c;语言就是一种人与人之间沟通的工具&#xff0c;像汉语&#xff0c;英语&#xff0c;法语……等。而人与计算机之间交流沟通的工具则被称为计算机语言&am…

Redis中RDB和AOF

Redis中RDB和AOF 定时间间隔执行数据集的时间快照&#xff0c;把某一时刻数据和妆容以文件的形式写到磁盘上&#xff0c;也就是快照。 配置文件 如果是普通安装方式可以跳过&#xff0c;如果是docker安装&#xff0c;需要到官网下载redis.conf配置文件到本地&#xff0c;地址…

单挑力扣(LeetCode)SQL题:1951. 查询具有最多共同关注者的所有两两结对组(难度:中等)

题目&#xff1a;1951. 查询具有最多共同关注者的所有两两结对组 &#xff08;通过次数2,464 | 提交次数3,656&#xff0c;通过率67.40%&#xff09; 表: Relations ------------------- | Column Name | Type | ------------------- | user_id | int | | follower_id |…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

深入浅出图解C#堆与栈 C# HeapingVS Stacking第二节 栈基本工作原理 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.cs…