第十六章 反射与注解

news2024/9/25 11:17:18

 

所有 Java 类均继承了 bjet 类,在 Object 类中定义了一个 getClass0方法,该回一个类型为Class的对象。例如下面的代码:

JTextField textField = new JTextField();//创建JTextField对象
Class textFieldC = textField.getClass();//获取Class对象
利用Class类的对象textFieldC,可以访问用来返回该对象的 textField 对象的描述信息。可的主要描述信息如表16.1所示。

16.1.1访问构造方法
在通过下列一组方法访问构造方法时,将返回Constructor类型的对象或数组。每个Constructor对象代表一个构造方法,利用Constructor 对象可以操纵相应的构造方法:

1,getConstructors0)
2,getConstructor(Class<?>...parameterTypes)

3,getDeclaredConstructors0)

4,getDeclaredConstructor(Class<?>...parameterTypes)。

如果是访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。例如,访问一个入口参数类型依次为 String 型和 nt 型的构造方法,通过下面两种方式均可实现:

objectClass.getDeclaredConstructor(String.class, int.class);
objectClass.getDeclaredConstructor(new Classl[] {String.class, int.clas };

 

例如,判断对象constructor 所代表的构造方法是否被 private 修饰,以及以字符形式获的该构造方
法的所有修饰符的典型代码如下:

int modifiers = constructor.getModifiers();
boolean isEmbellishByPrivate = Modifier.isPrivate(modifiers);
String embellishment = Modifier.toString(modifiers):
[例16.1]反射一个类的所有构造方法

ConstructorDemol,在该类中通过反射访间 com.mrDemol 类中的所有构造方法造构造方法是否允许带有可变数量的参数、入口参数类型和可能抛出的异常类型信息输出到控制台:

import java.lang.reflect.Constructor;
 
	import com.mr.Demo1;
 
	public class ConstructorDemo1 {
 
		public static void main(String[] args) {
			Demo1 d1= new Demo1("10","20","30");
			Class<? extends Demo1> Demo1Class = d1.getClass();
			//获得所有构造方法
			Constructor[] declaredConstructors = 
					Demo1Class.getDeclaredConstructors();
			for (int i= 0; i < declaredConstructors.length; i++){//遍历构造方法
				Constructor<?> constructor = declaredConstructors[i];
					System.out.println("查看是否允许带有可变数量的参数:" +constructor.isVarArgs());
					Class[] parameterTypes = constructor.getParameterTypes(); //获取所有参数类型
					for (int j= 0; j< parameterTypes.length; j++) {
							System.out.println(""+ parameterTypes);}
					System.out.println("该构造方法可能抛出的异常类型为:");
					//获得所有可能抛出的异常信息类型
					Class[] exceptionTypes = constructor.getExceptionTypes();
					for (int j = 0; j< exceptionTypes.length; j++) {
							System.out.println(""+ exceptionTypes[i]);
					}
					Demo1 d2 = null;
					while(d2 == null) {
						try{//如果构造方法的访问权限为 private或 protected,则抛出异常,即不允许访问
							if(i==2)//通过执行默认没有参数的构造方法创建对象
								d2 =(Demo1) constructor.newInstance();
								else if(i==1)
								//请过执行具有两个参数的构造方法创建对象
									d2 =(Demo1)constructor.newInstance("7",5);
								else {//通过执行具有可交数最参数的构造方法创建对象
									Object[] parameters = new Object[] {new String[] {"100","200","300"}};
									d2 =(Demo1) constructor.newInstance(parameters);
								}
						}catch(Exception e) {
							System.out.println("在创建对象时抛出异常,下面执行setAccessible()方法");
							constructor.setAccessible(true);
						}
					}
					if(d2 != null) {
						d2.print();
						System.out.println();
					}
			}
		}
	}

16.1.2 访间成员变量
通过下列一想方法访问成员变量时,将返回Field类型的对象或数组,每个Field 对象代表一个成员变量:

getFields0)
getField(String name)
getDeclaredFields().
getDeclaredFicld(String name)
如果是访问指定的成员变,可以通过该成员变量的名称来访问。例如,访问一个名称为brithday访问方法如下

object. getDeclaredField("birthday");

 [例16.2]反射一个类的所有成员变量

16.2Annotation注解功能

@override  限定重写父类方法

@suppresswarnings   抑制编译器警告 

@deprecated   标示已过时 

16.4创建自定义的注解

 

 

16.2.2访问Annotation 信息

 

 

 

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

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

相关文章

Java练习题2020-3

统计从1到N的整数中,所有立方值的平方根为整数的数的个数 输入说明&#xff1a;整数 N(N<10000)&#xff1b; 输出说明&#xff1a;符合条件的数的个数&#xff0c;如4^3648^2 输入样例&#xff1a;10 输出样例&#xff1a;3 (说明&#xff1a;样例中符合条件的3个数是1、4、…

【Linux】部署单机项目以及前后端分离项目

Linux部署单机项目&#xff1a; 优点&#xff1a; 简化了系统管理&#xff1a;由于所有服务都在同一台机器上运行&#xff0c;因此可以简化系统管理和维护。 提高了性能&#xff1a;由于没有网络延迟和其他因素的影响&#xff0c;所以可以提高系统的性能。 缺点&#xff1a; 容…

C/C++宏定义和宏函数

1.概述 C/C 的宏定义和宏函数非常的有用&#xff0c;由于最近看Android 的jni代码时老是会看见如下图所示的宏定义&#xff1a; 定义完后使用的时候直接如下使用就行了&#xff1a; JMI_DECLARE_CLASS(Context,android.content);这样就能很简洁的将一些逻辑重复的代码管理起来…

71 搜索二维矩阵

搜索二维矩阵 题解1 Z字查找(tricky)题解2 一次二分查找题解3 两次二分查找 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target …

OpenAI 组建安全 AGI 新团队!应对AI“潘多拉魔盒”

夕小瑶科技说 原创 作者 | 小戏 一旦谈及未来 AI&#xff0c;除了天马行空的科幻畅想&#xff0c;不可避免的也有未来 AI 时代的末日预言。从 AI 武器化到 AI 欺骗&#xff0c;从邪恶 AI 到 AI 掌权&#xff0c;人工智能&#xff0c;尤其是通用人工智能的风险始终都清清楚楚的…

nrf52832 开发板入手笔记:资料搜集

前言 最近翻箱&#xff0c;发现了两块几年前买的 NRF52832 与 NRF52840 的开发板&#xff0c;打算搭个 BLE 的开发环境 NRF52832 与 NRF51822 之前用过&#xff0c; NRF52840 没有用过&#xff0c;好像是 BLE4 与 BLE5 的区别吧 相关介绍 除了开发板&#xff0c;最重要的还是…

有线网卡通过无线网卡使其它设备上网

我现在的网络是无线路由器连接公网&#xff0c;电脑上的无线网卡连接路由器使电脑上网&#xff0c;这是完全正常的连接方式。 我现在又有了一台嵌入式设备&#xff0c;它只有有线网口&#xff0c;所以就只能用有线的方式连网&#xff0c;但是我的无线路由器不在电脑旁边&#x…

【23种设计模式】依赖倒置原则

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

openpnp - 程序发布包的制作

文章目录 openpnp - 程序发布包的制作概述笔记程序发布 - 简易打包备注程序发布 - 用install4j来打包END openpnp - 程序发布包的制作 概述 openpnp自带了intall4j的安装脚本. 官方说明这是intall4j 8.x的工程. 下载了intall4j 8.x(找不到注册码, 只能是90天试用版) 和 10.x…

小黑子—spring:第二章 注解开发

spring入门2.0 二 小黑子的spring注解开发1. Bean的基本注解开发1.1 注解版本1.2 Component使用和作用范围1.2.1 作用范围等注解使用1.2.2 Component的三个衍生注解 2. Bean依赖注入注解开发2.1 依赖注入相关注解2.2 Autowired扩展 3. 非自定义Bean注解开发4. Bean配置类的注解…

计算机网络【CN】子网划分与子网掩码

一个子网定义(X.X.X.X/n) 子网掩码为 n 个 1&#xff0c;32-n 个 0包含的 IP 地址数&#xff1a;232−n 主机号全 0 表示本网段主机号全 1 表示网段的广播地址可分配的 IP 地址数 :232−&#x1d45b;−2 子网划分原则 满足子网定义子网&#x1d434;1…&#x1d434;&#x…

牛客网刷题-(6)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

QT OpenGL (1)2D Painting Example

2D Painting Example 为方便查阅&#xff0c;此文是原网站文档翻译与整理&#xff0c;如有侵权&#xff0c;请与本人联系。 官网 目录 2D Painting Example概述Helper类定义Helper类实现Widget类定义Widget类实现GLWidget类定义GLWidget类实现Window 类定义Window 类实现运行示…

《利息理论》指导 TCP 拥塞控制

欧文费雪《利息原理》第 10 章&#xff0c;第 11 章对利息的几何说明是普适的&#xff0c;任何一个负反馈系统都能引申出新结论。给出原书图示&#xff0c;本文依据于此&#xff0c;详情参考原书&#xff1a; 将 burst 看作借贷是合理的&#xff0c;它包含成本(报文)&#xf…

代码随想录算法训练营第三十五天丨 贪心算法part06

738.单调递增的数字 思路 暴力解法 题意很简单&#xff0c;那么首先想的就是暴力解法了【超时】。 贪心算法 题目要求小于等于N的最大单调递增的整数&#xff0c;那么拿一个两位的数字来举例。 例如&#xff1a;98&#xff0c;一旦出现strNum[i - 1] > strNum[i]的情况…

通过Vue自带服务器实现Ajax请求跨域(vue-cli)

通过Vue自带服务器实现Ajax请求跨域&#xff08;vue-cli&#xff09; 跨域 原理&#xff1a;从A页面访问到B页面&#xff0c;并且要获取到B页面上的数据&#xff0c;而两个页面所在的端口、协议和域名中哪怕有一个不对等&#xff0c;那么这种行为就叫跨域。注意&#xff1a;类…

大厂面试题-Java并发编程基础篇(二)

目录 一、wait和notify这个为什么要在synchronized代码块中&#xff1f; 二、ThreadLocal是什么&#xff1f;它的实现原理呢&#xff1f; 三、基于数组的阻塞队列ArrayBlockingQueue原理 四、怎么理解线程安全&#xff1f; 五、请简述一下伪共享的概念以及如何避免 六、什…

【Qt之控件QKeySequenceEdit】分析及使用

描述 QKeySequenceEdit小部件允许输入一个QKeySequence。 该小部件允许用户选择一个QKeySequence&#xff0c;通常用作快捷键。当小部件获取焦点时&#xff0c;录制将开始&#xff0c;并在用户释放最后一个键后的一秒钟结束。 用户可以使用输入键盘来输入键序列。通过调用get…

迁移学习 - 微调

什么是与训练和微调&#xff1f; 你需要搭建一个网络模型来完成一个特定的图像分类的任务。首先&#xff0c;你需要随机初始化参数&#xff0c;然后开始训练网络&#xff0c;不断调整参数&#xff0c;直到网络的损失越来越小。在训练的过程中&#xff0c;一开始初始化的参数会…

matlab创建矩阵、理解三维矩阵

1.创建矩阵 全0矩阵&#xff1a;a zeros(2,3,4) 全1矩阵&#xff1a;a ones(2,3,4) &#xff01;和python不一样的地方&#xff01;此处相当于创建了4页2行3列的矩阵&#xff0c;而在python里是2页3行4列。 对第1页的第2行第3列元素进行修改&#xff1a;