JavaEE企业开发新技术3

news2024/11/13 8:10:14

目录

2.11  Method的基本操作-1

文字性概念描述

代码:

2.12 Method的基本操作-2

2.13 Method的基本操作-3

2.14 数组的反射操作-1

文字性概念:

代码:

2.15 数组的反射操作-2


  • 学习内容

2.11  Method的基本操作-1

文字性概念描述

Method类

Method用来表示类中的方法。通过Class对象的如下方法得到Method对象

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

按名称得到某个特定的public方法(包括从父类或接口继承的方法)

Method[] getMethods()

得到public方法(包括从父类或接口继承的方法)

Methodl getDeclaredMethods()

得到所有的方法(不包括继承的方法)

Method getDeclaredMethod(String name, Class<?>...parameterlypes)

按名称得到某个特定的方法(不包括继承的方法)

得到某个方法对应的Method对象后,需要调用如下方法来在某个对象上执行该方法:

(1)invoke(Object obj,Object ...obj)方法用来调用Method所表示的方法。其中,第一个参数表示此方法作用于哪一个对象。

注意:如果调用的是个静态方法,那么invoke0方法中第一个参数用null表示。

代码:
public abstract class Test3 {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
		Person p1=new Person();
		Class clazz1=p1.getClass();
		System.out.println(clazz1==Person.class);
		
		Person p=(Person)clazz1.getConstructor(Integer.class,String.class,String.class,int.class,String.class).newInstance(100,"小明","男",1,"O型血");
		
		Method[] methods=clazz1.getMethods();
		for(Method m:methods) {
			System.out.println("共有的方法名称是:"+m.getName());
		}
	}
}

总结:拿到了所有共有的方法,包括从父类继承的方法

Person类中添加缺省的方法

void init() {

System.out.println("Person的init()方法");

}

测试类:

Method[] methods=clazz1.getDeclaredMethods();
		for(Method m:methods) {
			System.out.println("共有的方法名称是:"+m.getName());
		}

总结:运行结果中有init方法,没有拿到从父类继承的方法

Method method1=clazz1.getMethod("getName", null);

System.out.println("得到的方法是:"+method1.getName());

总结:getMethod得到的是指定的方法,第一个参数是得到方法的名称 ,第二个参数是方法带的参数的class类型

Person类加的私有的方法:

private void operation(String message) {

System.out.println(message);

}

Method method2=clazz1.getDeclaredMethod("operation", String.class);

System.out.println("得到的方法是:"+method2.getName());

2.12 Method的基本操作-2

Method method2=clazz1.getDeclaredMethod("operation", String.class);
		System.out.println("得到的方法是:"+method2.getName());
		
		//得到Method对象的最终目的还是为了去调用这个方法
		method2.setAccessible(true);//如果要执行一个私有的访问权限的方法,调用该方法之前要执行setAccessible方法,设置为true
		method2.invoke(p, "这是调用该方法时传递的实际参数");

//静态方法

public static void showMessage(String message) {

System.out.println(message);

}

Method method3=clazz1.getMethod("showMessage", String.class);
		System.out.println("得到的方法是:"+method3.getName());
		method3.invoke(null, "这是调用静态的showMessage方法");

总结:通过反射的方式调用静态方法,invoke()方法的第一个参数并不和某一个具体的对象所关联起来,所以第一个参数赋为null

2.13 Method的基本操作-3

public void showMessages(String[] strs) {

for(String s:strs) {

System.out.println(s);

}

}

Method method3=clazz1.getMethod("showMessages", String[].class);
		System.out.println("得到的方法是:"+method3.getName());
		
		String[] strs= {"你好","咸阳师范学院","计算机学院"};
		//调用数组参数的方法时,把整个实际的数组作为一个Object数组的唯一元素进行调用
		//method3.invoke(p,new Object[] {strs});
		
		//把实际数组下转成Object对象
		method3.invoke(p,(Object)strs);

Object obj=new String[] {"你好","咸阳师范学院","计算机学院"};

//数组也是复合数据类型

2.14 数组的反射操作-1

文字性概念:

在Java中数组属于复合数据类型,具有相同元素类型和维数的数组属于同一个类型,即具有相同的字节码对象。

代表数组的字节码对象调用getsuperClass()得到它的父类Object的字节码对象。

基本数据类型的一维数组可以当做Object类型使用,但不能当做Object[]类型使用;基本数据类型的二维数组可以当做Object[]类型使用;复合数据类型的一维数组既可以当做Object类型使用,也可以当做Object[]类型使用

java.lang.reflect.Array用于完成对数组的反射操作。

代码:
Object obj1=new int[3];//基本数据类型一维数组可以当作Object使用
		//Object[] obj2=new int[4];//基本数据类型一维数组不可以当作Object[]使用
		Object[] obj3=new int[4][5];//基本数据类型二维数组可以当作Object[]使用
		
		Object obj4=new String[4];//一维复合数据类型数组当作Object使用
		Object[] obj5=new String[4];//一维复合数据类型数组也可以当作Object[]使用
		
		Object[][] obj6=new String[4][5];//二维复合数据类型的数组可以当作			Object,Object[],或者Object[][]使用
		
		int a1[]=new int[6];
		int a2[]=new int[100];
		//只要维数像扽,类型相等,那么我们就数组的class对象相等(和元素个数无关)
		System.out.println(a1.getClass()==a2.getClass());

2.15 数组的反射操作-2

public void printArrayElements(Object obj) {
		Class clazz=obj.getClass();
		if(clazz.isArray()) {       //判断Class类型是否是数组
			int length=Array.getLength(obj);     //Array类可以对数组进行反射操作
			for(int i=0;i<length;i++) {
				//System.out.println(Array.get(obj, i));//在某个数组对象上获取下标为i的元素
				printArrayElements(Array.get(obj, i));   //递归调用
			}
		}
		else {
			System.out.println(obj);
		}
	}

测试类:

String[] strs= {"计算机科学与技术","软件工程","物联网工程"};
		int[][] a= {{1,2},{3,4}};
		
		String[][] str2= {{"计算机科学与技术","软件工程","物联网工程"},{"计算机科学与技术1","软件工程1","物联网工程1"}};
		
		p.printArrayElements(str2);

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

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

相关文章

io的学习4

打印流 分类&#xff1a;打印流一般是指&#xff1a;PrintStream、PrintWriter两个类 特点&#xff1a; 1.打印流只操作文件目的地&#xff0c;不操作数据源 2.特有的写出方法可以实现&#xff0c;数据原样写出 3.特有的写出方法&#xff0c;可以实现自动刷新&#xff0c;…

仅用一个月,游卡完成从MySQL到上线OceanBase的实践

编者按&#xff1a;自2023年9月起&#xff0c;游卡——国内最早卡牌游戏研发者之一&#xff0c;开始测试OceanBase&#xff0c;并在短短两个月内成功将三个核心业务应用迁移至OceanBase上。究竟是何因素促使游卡放弃游戏行业普遍采用的MySQL方案&#xff0c;转而大胆选择OceanB…

荟萃分析R Meta-Analyses 3 Effect Sizes

总结 效应量是荟萃分析的基石。为了进行荟萃分析&#xff0c;我们至少需要估计效应大小及其标准误差。 效应大小的标准误差代表研究对效应估计的精确程度。荟萃分析以更高的精度和更高的权重给出效应量&#xff0c;因为它们可以更好地估计真实效应。 我们可以在荟萃分析中使用…

一文整合工厂模式、模板模式、策略模式

为什么使用设计模式 今天终于有时间系统的整理一下这几个设计模式了&#xff0c; 这几个真是最常用的&#xff0c;用好了它们&#xff0c;你就在也不用一大堆的if else 了。能更好的处理大量的代码冗余问题。 在我们的实际开发中&#xff0c;肯定会有这样的场景&#xff1a;我…

【C语言基础】:内存操作函数

文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…

Qt与编码

ASCII码:一个字节&#xff0c;256个字符。 Unicode:字母&#xff0c;汉字都占用两个字节。 utf-8:字母一个字节&#xff0c;汉字3个字节。 gbk:字母一个字节&#xff0c;汉字2个字节。 gb2312:可以表示汉字&#xff0c;gb2312<gbk。 编码查看&#xff1a; https://www.…

钡铼技术R40路由器助力构建无人值守的智能化污水处理厂

钡铼技术R40路由器作为智能化污水处理厂的关键网络设备&#xff0c;发挥着至关重要的作用&#xff0c;助力构建无人值守的智能化污水处理系统。在现代社会&#xff0c;污水处理是城市环境保护和可持续发展的重要组成部分&#xff0c;而智能化污水处理厂借助先进的技术和设备&am…

C语言数据结构易错知识点(5)(插入排序、选择排序)

插入排序&#xff1a;直接插入排序、希尔排序 选择排序&#xff1a;直接选择排序、堆排序 上述排序都是需要掌握的&#xff0c;但原理不会讲解&#xff0c;网上有很多详尽地解释&#xff0c;本文章主要分享一下代码实现上应当注意的事项 1.直接插入排序&#xff1a; 代码实…

Kevin的128纪念日

上面这个是我在三天前做的一个开场白一样的封面。在设计的时候我的想法很简单&#xff0c;把自己给展现出来。我没有去过多的加其他花花绿绿的东西&#xff0c;我想把我本身的状态和形象给凸显出来。 哈哈~看到这里有人就想问&#xff0c;这个躺在沙发上吃零食的懒猫就是你的个…

利用瑞士军刀netcat建立连接并实现文件上传

实验环境&#xff1a; Kali:192.168.117.129 Windows10:192.168.135.142 第一步&#xff1a;建立连接 在Windows上下载netcat(官网搜索) 下载好之后在netcat目录打开cmd进入小黑屏 实验一&#xff1a;建立虚拟机与主机的连接 命令&#xff1a; Kali:nc 192.168.135.144…

FastAPI+React全栈开发05 React前端框架概述

Chapter01 Web Development and the FARM Stack 05 The frontend React FastAPIReact全栈开发05 React前端框架概述 Let’s start with a bit of context here. Perhaps the changes in the world of the web are most visible when we talk about the frontend, the part o…

前端学习之css基本网格布局

网格布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网格布局</title><style>.a{/* grid网格布局 */display: grid;width: 400px;height: 400px;border: 1px solid red;/* 设置当前…

【Spring】IoCDI详解

1. IoC详解 前面提到过IoC就是将对象的控制权交由Spring的IoC容器进行管理&#xff0c;由Spring的IoC容器创建和销毁bean&#xff0c;那么既然涉及到容器&#xff0c;就一定包含以下两方面功能&#xff1a; bean的存储bean的获取 1.1 类注解 Spring框架为了更好地服务应用程…

RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能

RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能 文章目录 RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能1. RabbitMQ端口说明2. 开启Rabbitmq后台管理功能1. 查看rabbitmq已安装的插件2. 开启rabbitmq后台管理平台插件3. 开启插件后&#xff0c;再次查看插…

学习笔记Day15:Shell脚本编程

Shell脚本编程 Linux系统环境 Linux系统的4个主要部分&#xff1a;内核、shell、文件系统和应用程序。 内核是操作系统的核心&#xff0c;决定系统性能和稳定性shell &#xff1a;一种应用程序&#xff0c;是用户和内核交互操作的接口&#xff0c;是套在内核外的壳&#xff…

Linux文件IO(2):使用标准IO进行文件的打开、关闭、读写、流定位等相关操作

目录 前言 文件的打开和关闭的概念 文件的打开 文件的打开函数 文件打开的模式 文件的关闭 文件的关闭函数 注意事项 字符的输入&#xff08;读单个字符&#xff09; 字符输入的函数 注意事项 字符的输出&#xff08;写单个字符&#xff09; 字符输出的函数 注意…

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中&#xff0c;我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中&#xff0c;使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库&#xff0c;旨在通过…

微服务day07 -- 搜索引擎 ( 数据聚合 + 自动补全 + 数据同步 + ES集群 )

1.数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f; 这些手机的平均价格、最高价格、最低价格&#xff1f; 这些手机每月的销售情况如何&#xff1f; 实现这些…

ydata_profiling:自动生成数据探索报告的Python库

之前在做数据分析的时候&#xff0c;用过一个自动化生成数据探索报告的Python库&#xff1a;ydata_profiling 一般我们在做数据处理前会进行数据探索&#xff0c;包括看统计分布、可视化图表、数据质量情况等&#xff0c;这个过程会消耗很多时间&#xff0c;可能需要上百行代码…

数据库实验(一)SQL Server触发器

目录 触发器的定义 触发器和存储过程的区别 触发器的优点 触发器的作用 触发器的分类 DML触发器 DDL触发器 登录触发器 触发器的工作原理 inserted表 deleted表 创建触发器 编程要求 测试要求&#xff1a; 实验代码&#xff1a; 触发器的定义 触发器是建立在触…