JavaEE企业开发新技术3

目录

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);

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

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

相关文章

.NET分布式Orleans - 2 - Grain的通信原理与定义

Grain 是 Orleans 框架中的基本单元&#xff0c;代表了应用程序中的一个实体或者一个计算单元。 每个Silo都是一个独立的进程&#xff0c;Silo负责加载、管理和执行Grain实例&#xff0c;并处理来自客户端的请求以及与其他Silo之间的通信。 通信原理 在相同的Silo中&#xff0…

【数据结构】顺序表的定义

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

vscode下c++的boost库安装

Boost Downloadshttps://www.boost.org/users/download/下载最新的库文件。在shell中&#xff0c;使用命令bootstrap.bat gcc生成b2.exe文件。然后是.\b2.exe toolsetgcc生成库文件&#xff0c;在stage\lib文件夹下把stage\lib文件夹中的库文件拷贝到mingw64\x86_64-w64-mingw3…

小程序从入门到入坑:事件系统

前言 哈喽大家好&#xff0c;我是 SuperYing&#xff0c;本文是小程序从入门到入坑系列的第 3 篇&#xff0c;将比较详尽的讲解 小程序事件系统 的相关知识点&#xff0c;欢迎小伙伴阅读。 读完本文您将收获&#xff1a; 了解小程序事件及基础使用。了解小程序事件分类及多种的…

我们是如何在 IDE 中设计 AutoDev 的 AI 编程开发智能体语言与框架?

上周微软发布了自家的 AI 编程和软件开发智能体框架&#xff1a;AutoDev&#xff0c;其与我们开发的 IDE 插件 AutoDev 有颇多的相似之处&#xff0c;特别是一些设计思路&#xff0c;以及在对于辅助软件开发任务的智能体以及一些基础设施上。 稍有不同的是&#xff1a; 交互介质…

【YOLOV5 入门】——环境配置(Miniconda/Pytorch/YOLOv5/PYPI镜像源)

声明&#xff1a;笔记是毕设时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 计划&#xff1a; 入门篇&#xff1a;环境安装、模型检测、构建自定义数据集、训练数据集、可视化界面搭建、Web系统搭建。拓展篇&#xff1a;使用服务器训练、使用pycharm和…

LeetCode第2583题

难度&#xff1a;中等 给你一棵二叉树的根节点 root 和一个正整数 k 。树中的层和是指同一层上节点值的总和。返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返回 -1 。注意&#xff0c;如果两个节点与根节点的距离相同&#xff0c;…

每日一练:LeeCode-21、合并两个有序链表【链表+递归+非递归】

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[…

刚刚,百度和苹果宣布联名

百度 Apple 就在刚刚&#xff0c;财联社报道&#xff0c;百度将为苹果今年发布的 iPhone16、Mac 系统和 iOS18 提供 AI 功能。 苹果曾与阿里以及另外一家国产大模型公司进行过洽谈&#xff0c;最后确定由百度提供这项服务&#xff0c;苹果预计采取 API 接口的方式计费。 苹果将…

深入了解直播美颜技术:美颜SDK的性能优化与算法创新

美颜技术的核心是美颜SDK&#xff0c;它不仅仅是简单的滤镜应用&#xff0c;更是依托着先进的算法和性能优化实现的。接下来&#xff0c;小编将深度探讨美颜SDK的性能优化与算法创新&#xff0c;带您了解这一领域的最新进展。 一、美颜技术的发展历程 随着移动设备性能的提升和…

weindos的docker 运行Hyperf 日志

weindos的docker 运行日志 进入cmd窗口 docker run --name hyperf -v D:\phpstudy_pro\WWW\hyperf.com\hyperf-skeleton:/data/project -p 9501:9501 -it --privileged -u root --entrypoint /bin/sh hyperf-skeleton:latest D:\phpstudy_pro\WWW\hyperf.com\hyperf-skeleton是…

vscode添加gitee

1.创建仓库 2.Git 全局设置 3.初始化仓库 2.1 打开vscode打开需要上传到给git的代码文件 2.2.点击左边菜单第三个的源代码管理->初始化仓库 4.点击加号暂存所有更改 5.添加远程仓库 5.1 添加地址&#xff0c;回车 5.2 填写库名&#xff0c;回车 6.提交和推送 6.1 点击✔提交…

安防监控视频汇聚平台EasyCVR在银河麒麟V10系统中的启动异常及解决方法

安防监控视频平台EasyCVR具备较强的兼容性&#xff0c;它可以支持国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台兼容性强&#xff0c;支持Windows系…

从0到1:校园生活圈小程序开发笔记(一)

可行性研究 校园生活圈小程序是一种面向大学或学院校园的社交平台&#xff0c;旨在为校园内的师生提供交流、分享、互助和信息发布等功能。 为校园内的师生提供一个便捷的平台&#xff0c;帮助他们更好地了解校园生活、参与校园活动、交流学习和共享资源。 功能分解 公告资讯…

关于RPC

初识RPC RPC VS REST HTTP Dubbo Dubbo 特性&#xff1a; 基于接口动态代理的远程方法调用 Dubbo对开发者屏蔽了底层的调用细节&#xff0c;在实际代码中调用远程服务就像调用一个本地接口类一样方便。这个功能和Fegin很类似&#xff0c;但是Dubbo用起来比Fegin还要简单很多&a…

Vue3 + Vite + TS + Element-Plus + Pinia项目(5)对axios进行封装

1、在src文件夹下新建config文件夹后&#xff0c;新建baseURL.ts文件&#xff0c;用来配置http主链接 2、在src文件夹下新建http文件夹后&#xff0c;新建request.ts文件&#xff0c;内容如下 import axios from "axios" import { ElMessage } from element-plus im…

Pillow教程05:NumPy数组和PIL图像的相互转化

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

Qt Design Studio 软件怎么用(详细+通俗+有趣)

建议&#xff1a;本文长期更新&#xff0c;建议点赞/收藏&#xff01; 1. 啥是Qt Design Studio&#xff1f; Qt Design Studio 是一个用于设计和开发用户界面的工具&#xff0c;特别适合开发跨平台应用程序。它结合了UI设计和开发的工作流程&#xff0c;使得设计师和开发者可…

Unity 视频组件 VideoPlayer

组件添加&#xff1a; 在自己定义的组件下&#xff08;例如&#xff1a;Panel&#xff09; 点击 Inspector 面板中的 AddComponent &#xff0c;输入“VideoPlayer”。 资源 这里 视频资源有两种形式&#xff0c;第一种是 VideoClip &#xff0c;需要将视频文件拖拽到该属性字段…

CI/CD实战-jenkins结合docker 5

实验准备&#xff1a; 在docker主机要下载git工具 禁掉key的校验 确保在立即构建项目时不会出现任何报错&#xff1a; 自动化构建docker镜像 在server3上安装docker-ce 修改内核参数 拷贝证书 添加默认仓库 添加harbor仓库的解析 测试拉取 登录harbor私有仓库 在jenkins安装d…