【java学习—十四】反射获取类的父类、接口、构造方法、方法(3)

news2024/10/6 10:32:14

文章目录

  • 1. 通过反射获取一个类的父类和接口
  • 2. 反射获取一个类的构造方法
  • 3. 反射获取全部构造器
  • 4. 通过反射创建一个对象
  • 5. 反射机制获取类的方法


1. 通过反射获取一个类的父类和接口

使用反射可以取得:

  1. 实现的全部接口
    public Class<?>[] getInterfaces():确定此对象所表示的类或接口实现的接口。
  2. 所继承的父类
    public Class<? Super T> getSuperclass():返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的 Class 。

举例:通过反射调用实现的全部接口和所继承的父类。
其中父类为Person类,子类为Student类,两种接口分别为Move和Study两种,用来描述上学方式和学习范围。

实现步骤:
步骤一:定义Person类:

package day14;

public class Person {
	public String name;
	int age;
	
}

步骤二:定义接口Move和Study
(1)Move

package day14;

public interface Move {
	void moveType();
}

(2)Study

package day14;

public interface Study {
	void studyInfo();
}

步骤三:定义Person的子类Student并实现上面两种接口

package day14;

public class Student extends Person implements Move,Study{
	
	String school;
	
	public void showInfo() {
		System.out.println("学校是:" + this.school);
	}
	
	@Override
	public void studyInfo() {
		System.out.println("学习的是中学知识");
	}
	
	@Override
	public void moveType() {
		System.out.println("骑自行车去上学");
	}

}

步骤四:Test.java

package day14;

public class Test1 {

	public static void main(String[] args) {
		try {
			Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例
			
			Class superClazz = clazz.getSuperclass();//获取父类
			System.out.println(superClazz.getName());
			
			Class[] interfaces = clazz.getInterfaces();//获取当前类的所有接口
			for(Class c : interfaces) {
				System.out.println("接口:" + c.getName());
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

Test.java运行结果:

在这里插入图片描述

2. 反射获取一个类的构造方法

public Constructor[] getConstructors():返回此 Class 对象所表示的类的所有 public 构造方法。

举例

对上述类Student方法添加三个构造方法

package day14;

public class Student extends Person implements Move,Study{
	//构造方法1
	public Student() {
		
	}
	//构造方法2
	public Student(String school) {
		this.school = school;
	}
	//构造方法3
	private Student(String school, int age) {
		this.school = school;
		this.age = age;
	}
	
	
	String school;
	
	public void showInfo() {
		System.out.println("学校是:" + this.school);
	}
	
	@Override
	public void studyInfo() {
		System.out.println("学习的是中学知识");
	}
	
	@Override
	public void moveType() {
		System.out.println("骑自行车去上学");
	}

}

Test.java:

package day14;

import java.lang.reflect.Constructor;

public class Test1 {

	public static void main(String[] args) {
		try {
			Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例								
			Constructor[] cons = clazz.getConstructors();
			for(Constructor c : cons) {
				System.out.println("构造方法名称:" + c.getName());
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

运行结果:
在这里插入图片描述

3. 反射获取全部构造器

public Constructor[] getConstructors():返回此 Class 对象所表示的类的所有 public 构造方法。
public Constructor[] getDeclaredConstructors():返回此 Class 对象表示的类声明的所有构造方法。

Constructor 类中:
    ①取得修饰符 : public int getModifiers();
    ②取得方法名称 : public String getName();
    ③取得参数的类型: public Class<?>[] getParameterTypes();

举例:

Test.java:

package day14;

import java.lang.reflect.Constructor;

public class Test1 {

	public static void main(String[] args) {
		try {
			Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例			
			
			Constructor[] cons = clazz.getConstructors();//获取类的公有构造方法
			
			for(Constructor c : cons) {
				System.out.println("-----------------------0------------------------------");
				System.out.println("构造方法名称:" + c.getName());//获取方法名称
				//getModifiers取得方法的修饰符,返回数组1代表public
				System.out.println("构造方法:" + c.getName() + "的修饰符是:" + c.getModifiers());//获取方法的修饰符
				
				Class[] paramClazz = c.getParameterTypes();
				
				for(Class pc : paramClazz) {
					System.out.println("构造方法:" + c.getName() + "的参数类型是:" + pc.getName());
				}
				System.out.println("-----------------------1------------------------------");
			}
			
			
			
			Constructor[] cons1 = clazz.getDeclaredConstructors();//获取类的所有构造方法,包括公有和私有的
			
			for(Constructor c : cons1) {
				System.out.println("----------------------000-----------------------------");
				
				System.out.println("构造方法名称:" + c.getName());//获取方法名称
				//getModifiers取得方法的修饰符,返回数组1代表public;返回数字2代表是private
				System.out.println("构造方法:" + c.getName() + "的修饰符是:" + c.getModifiers());//获取方法的修饰符
				
				Class[] paramClazz = c.getParameterTypes();
				
				for(Class pc : paramClazz) {
					System.out.println("构造方法:" + c.getName() + "的参数类型是:" + pc.getName());
				}
				System.out.println("----------------------111-----------------------------");
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

运行结果:

在这里插入图片描述

4. 通过反射创建一个对象

举例:
Student类:

package day14;

public class Student extends Person implements Move,Study{
	
	public Student() {
		System.out.println("调用的是public Student()");
		
	}
	
	public Student(String school) {
		this.school = school;
		System.out.println("调用的是public Student(String school)");
	}
	
	private Student(String school, int age) {
		this.school = school;
		this.age = age;
		System.out.println("调用的是private Student(String school, int age)");
	}
	
	
	
	String school;
	
	public void showInfo() {
		System.out.println("学校是:" + this.school);
	}
	
	@Override
	public void studyInfo() {
		System.out.println("学习的是中学知识");
		
	}
	
	@Override
	public void moveType() {
		System.out.println("骑自行车去上学");
		
	}

}

Test.java:

package day14;

import java.lang.reflect.Constructor;

public class Test1 {

	public static void main(String[] args) {
		try {
			Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例
			

			
			//如何用反射的构造方法来创建对象
			try {
				Object obj = clazz.getDeclaredConstructor().newInstance();//相当于调用Student类的无参公有的构造方法
				Student stu = (Student) obj;
//				System.out.println(stu.school);
				
				Constructor c = clazz.getConstructor(String.class);//指定获取有一个参数并且为String类型的共有的构造方法
				Student stu1 = (Student)c.newInstance("第一中学");//newInstance实例化对象,相当于调用public Student(String school)
				
				//通过反射机制可以强制地调用私有的构造方法
				Constructor c1 = clazz.getDeclaredConstructor(String.class, int.class);//指定获取有两个参数(String, int)的构造方法
				
				c1.setAccessible(true);//解除私有的封装,下面就可以对这个私有方法强制调用
				
				Student stu2 = (Student)c1.newInstance("zhangsan",12);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

运行结果:
在这里插入图片描述

5. 反射机制获取类的方法

public Method[] getDeclaredMethods():返回此 Class 对象所表示的类或接口的全部方法
public Method[] getMethods():返回此 Class 对象所表示的类或接口的 public 的方法

Method 类中:

  • public Class<?> getReturnType():取得全部的返回值
  • public Class<?>[] getParameterTypes(): 取得全部的参数
  • public int getModifiers(): 取得修饰符

举例:

Student类

package day14;

public class Student extends Person implements Move,Study{
	
	public Student() {
		System.out.println("调用的是public Student()");
		
	}
	
	public Student(String school) {
		this.school = school;
		System.out.println("调用的是public Student(String school)");
	}
	
	private Student(String school, int age) {
		this.school = school;
		this.age = age;
		System.out.println("调用的是private Student(String school, int age)");
	}
	
	
	
	String school;
	
	public void showInfo() {
		System.out.println("学校是:" + this.school);
	}
	
	@Override
	public void studyInfo() {
		System.out.println("学习的是中学知识");
		
	}
	
	@Override
	public void moveType() {
		System.out.println("骑自行车去上学");
		
	}
	
	private void test(String name) {
		
	}
	
	public String getSchool() {
		return this.school;
	}

}

Test.java:

package day14;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Test1 {

	public static void main(String[] args) {
		try {
			Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例
			
			
//			Method[] ms = clazz.getMethods();//获取到类的所有公有的方法
			Method[] ms = clazz.getDeclaredMethods();//获取到类的所有方法,包括私有的
			for(Method m : ms) {
				System.out.println("方法名:" + m.getName());
				System.out.println("方法名:" + m.getReturnType());
				System.out.println("方法名:" + m.getModifiers());
				
				Class[] pcs= m.getParameterTypes();//获取方法的参数类型,是一个数组,方法有几个参数,数据就有几个元素
				if(pcs != null && pcs.length > 0) {
					for(Class pc : pcs) {
						System.out.println("参数类型:" + pc.getName());
					}
				}
				System.out.println("=======================================");
				
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

运行结果:
在这里插入图片描述

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

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

相关文章

Python实现扫雷游戏,代码示例,边玩边学+回忆童年!

文章目录 前言实现总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 扫雷是一款益智类小游戏&#xff0…

香港科技大学广州|智能制造学域机器人与自主系统学域博士招生宣讲会—中国科学技术大学专场

&#x1f3e0;地点&#xff1a;中国科学技术大学西区学生活动中心&#xff08;一楼&#xff09;报告厅 【宣讲会专场1】让制造更高效、更智能、更可持续—智能制造学域 &#x1f559;时间&#xff1a;2023年11月16日&#xff08;星期四&#xff09;18:00 报名链接&#xff1a…

百望云携手华为发布金融信创与数电乐企联合方案 创新金融合规变革

10月27日&#xff0c;北京发布《关于开展全面数字化的电子发票试点工作的公告》&#xff0c;自2023年11月01日起开展数电票试点。千呼万唤始出来&#xff0c;拉开了北京地区企业开展数电票试点的序幕。 百望云作为数电票行业翘楚&#xff0c;电子发票服务平台供应商&#xff0c…

【C/C++底层】内存分配:栈区(Stack)与堆区(Heap)

/*** poject * author jUicE_g2R(qq:3406291309)* file 底层内存分配&#xff1a;栈区(Stack)与堆区(Heap)* * language C/C* EDA Base on MVS2022* editor Obsidian&#xff08;黑曜石笔记软件&#xff09;* * copyright 2023* COPYRIGHT …

论文阅读:Robust High-Resolution Video Matting with Temporal Guidance

发表时间&#xff1a;2021年8月25日 项目地址&#xff1a;https://peterl1n.github.io/RobustVideoMatting/ 论文地址&#xff1a;https://arxiv.org/pdf/2108.11515.pdf 我们介绍了一种鲁棒的&#xff0c;实时的&#xff0c;高分辨率的人体视频匹配方法&#xff0c;以实现了新…

【C++】:STL——标准模板库介绍 || string类

&#x1f4da;1.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 &#x1f4da;2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

得帆信息携手深信服,联合打造高安全PaaS超融合一体化解决方案

上海得帆信息技术有限公司&#xff08;以下简称“得帆”&#xff09;和深信服科技股份有限公司&#xff08;以下简称“深信服”&#xff09;携手推出融合安全性、稳定性、高效性于一体的全新PaaS超融合解决方案。 用户痛点分析 全面推进企业数字化与信息化的趋势下&#xff0c;…

伊朗黑客对以色列科技行业发起恶意软件攻击

最近&#xff0c;安全研究人员发现了一场由“Imperial Kitten”发起的新攻击活动&#xff0c;目标是运输、物流和科技公司。 “Imperial Kitten”又被称为“Tortoiseshell”、“TA456”、“Crimson Sandstorm”和“Yellow Liderc”&#xff0c;多年来一直使用“Marcella Flore…

DVWA - 3

文章目录 XSS&#xff08;Dom&#xff09;lowmediumhighimpossible XSS&#xff08;Dom&#xff09; XSS 主要基于JavaScript语言进行恶意攻击&#xff0c;常用于窃取 cookie&#xff0c;越权操作&#xff0c;传播病毒等。DOM全称为Document Object Model&#xff0c;即文档对…

在CentOS7环境下安装Mysql

1.卸载已有的不需要的环境 使用如下命令&#xff0c;查看系统中是否已经存在mysql和mariadb&#xff08;mysql的一个子分支&#xff09; ps ajx | grep mariadb ps ajx | grep mysql 如果显示与我相同&#xff0c;则代表系统中已经存在这些环境并且已经停止 如果不相同则需要…

Linux 函数库

函数库&#xff1a; 我们的C程序中&#xff0c;并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去…

块设备的工作模式

块设备的mknod 还是会创建在 /dev 路径下面&#xff0c;这一点和字符设备一样。/dev 路径下面是 devtmpfs 文件系统。这是块设备遇到的第一个文件系统。我们会为这个块设备文件&#xff0c;分配一个特殊的 inode&#xff0c;这一点和字符设备也是一样的。只不过字符设备走 S_IS…

创作者焦点:Royal Flushed(第二章)

一起来看看「Dr. Bomkus 的试炼」幕后的创作故事吧&#xff5e; 「创作者焦点」系列报道将带来六篇关于「Dr. Bomkus 的试炼」游戏的创作过程&#xff0c;以及其独特的游戏玩法和功能。 屏住呼吸&#xff0c;潜入沉没区。穿过 Bomkus 设计的水下迷宫&#xff0c;回到地面上&…

汽车以太网IOP测试新利器

IOP测试目的 汽车以太网物理层IOP&#xff08;Interoperability &#xff09;测试&#xff0c;即测试被测对象以太网物理层之间的互操作性。用于验证车载以太网PHY能否在有限时间内建立稳定的链路&#xff1b;此外&#xff0c;还用于验证车载以太网PHY可靠性相关的诊断特性&am…

基于SpringBoot+Vue的宿舍管理系统

基于SpringBootVue的学生宿舍管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宿舍公告 登录界面 管理员界面 维修人员 商家界面 学生界面 摘要 摘…

加密磁盘密钥设置方案浅析 — LUKS1

虚拟化加密磁盘密钥设置方案浅析 前言元数据分析元数据格式整体格式头部格式加密算法密码校验key slot格式其它字段 流程验证 前言 我们在虚拟化加密磁盘密钥设置方案浅析 — TKS1中介绍了加密磁盘密钥设置方案&#xff0c;TKS1对密钥设置(Linux Unified Key Setup)的流程和方…

pcl opencv关于flann的冲突:flann_algorithm_t等

问题如下&#xff1a; 引起问题的点&#xff1a; 解决方法&#xff1a;先include pcl后include opencv; 其他解决方式是在环境变量中将pcl置于opencv前面&#xff0c;但是这里如果是先include opencv&#xff0c;后include pcl问题得不到解决&#xff1b;

电源管理芯片知识分享:电源芯片的特点及故障检测方法

电源管理芯片用于对电源的控制和管理&#xff0c;提高设备的性能&#xff0c;被广泛应用于智能家居、电子商务、能源管理、汽车等领域&#xff0c;是现代电子设备不可缺少的部分。因此&#xff0c;对于电源管理芯片的检测也是十分重要的&#xff0c;发现其故障并及时解决&#…

flink 8081 web页面无法被局域网内其他机器访问

实现 http://localhost:8081/#/overview 可以被局域网其他机器访问

微信小程序:页面跳转传参问题

今天后端大兄弟突然拿着一个反编译过来的小程序源码&#xff0c;问能不能改。我心里直道好家伙&#xff0c;WebGIS开发的岗位&#xff0c;前端的活儿真是一个不少。大致看了看有几处是调整页面和接口修改的&#xff0c;源码部分和Vue项目语法十分相像&#xff0c;就临阵磨枪&am…