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

文章目录

  • 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();
		}
		
	}
}

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

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

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

相关文章

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

上一课&#xff1a; 【小黑嵌入式系统第一课】嵌入式系统的概述&#xff08;一&#xff09;——概念、特点、发展、应用 下一课&#xff1a; 【小黑嵌入式系统第三课】嵌入式系统硬件平台&#xff08;一&#xff09;——概述、总线、存储设备&#xff08;RAM&ROM&FLASH…

优思学院|新版ISO9001:2015质量体系的优势(一)高阶结构

在全球商业环境中&#xff0c;不断提高产品和服务的质量至关重要。因此&#xff0c;国际标准组织&#xff08;ISO&#xff09;于2015年发布了更新的ISO 9001标准&#xff0c;即ISO 9001:2015质量体系标准。这一更新旨在适应不断变化的商业需求和挑战&#xff0c;为组织提供更强…

母婴行业数字化发展趋势:内容多元化、服务定制化、人群全覆盖

母婴行业数字化发展趋势&#xff1a;内容多元化、服务定制化、人群全覆盖 引言&#xff1a;时代的高速发展&#xff0c;在经济压力、生活节奏、婚育观念等多重因素的影响下&#xff0c;我国人口出生率自2016年&#xff08;人口出生数量统计1883万&#xff09;到2022年&#xf…

nn.Embedding()的原理

nn.Embedding()的原理&#xff1a; 定义一个Embedding&#xff1a; embeddings nn.Embedding(num_embeddings10, embedding_dim3)vocab_size : 10 输出维度为&#xff1a; 3 假定输入inputs如下&#xff1a; inputs torch.tensor([[1,3,6, 8],[9,1,3,5] ],dtypetorch.lo…

zabbix基本介绍 安装部署 页面访问

这里写目录标题 一、zabbix 监控1、zabbix 监控架构2、zabbix 监控报警渠道3、Zabbix 优点4、Zabbix 缺点5、Zabbix 监控系统监控对象6、Zabbix监控方式7、zabbix 架构1、Server2、数据库存储3、Web界面4、Proxy 代理服务器5、Agent监控代理6、数据流 8、Zabbix常用术语的含义1…

『Linux升级路』基本指令

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、认识操作系统 &#x1f4d2;1.1什么是操作系统 &#x1f4d2;1.2操作系统…

基于ssm的高校共享单车管理系统(有报告)。Javaee项目,ssm项目。

演示视频&#xff1a; 基于ssm的高校共享单车管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&…

torch_cluster、torch_scatter、torch_sparse三个包的安装

涉及到下面几个包安装的时候经常会出现问题&#xff0c;这里我使用先下载然后再安装的办法&#xff1a; pip install torch_cluster pip install torch_scatter pip install torch_sparse 1、选择你对应的torch版本&#xff1a;https://data.pyg.org/whl/ 2、点进去然后&…

智慧工地AI视频管理平台源码

智慧工地是指以物联网、移动互联网技术为基础&#xff0c;充分应用人工智能等信息技术&#xff0c;通过AI赋能建筑行业&#xff0c;对住建项目内人员、车辆、安全、设备、材料等进行智能化管理&#xff0c;实现工地现场生产作业协调、智能处理和科学管理。智慧工地的核心是以一…

HBase中的数据表是如何用CHAT进行分区的?

问CHA&#xff1a;HBase中的数据表是如何进行分区的&#xff1f; CHAT回复&#xff1a; 在HBase中&#xff0c;数据表是水平分区的。每一个分区被称为一个region。当一个region达到给定的大小限制时&#xff0c;它会被分裂成两个新的region。 因此&#xff0c;随着数据量的增…

[C++]:8.C++ STL引入+string(介绍)

C STL引入string(介绍&#xff09; 一.STL引入&#xff1a;1.什么是STL2.什么是STL的版本&#xff1a;2-1&#xff1a;原始版本&#xff1a;2-2&#xff1a;P. J 版本&#xff1a;2-3&#xff1a;RW 版本&#xff1a;2-4&#xff1a;SGL版本&#xff1a; 3.STL 的六大组件&…

并发编程之生产者消费者模型

什么是生产者消费者模型 生产者消费者模型是多线程中一个比较典型的模型。 打个比方&#xff1a;你是一个客户&#xff0c;你去超市里买火腿肠。 这段话中的 "你"就是消费者&#xff0c; 那么给超市提供火腿肠的供货商就是生产者。超市呢&#xff1f;超市是不是被…

php连接sqlserver 安装sqlserver 驱动windows系统

第一步下载Windows 上的 Microsoft ODBC Driver for SQL Server ODBC 驱动程序 Microsoft ODBC Driver for SQL Server 直接下载安装即可&#xff0c;安装后可查看安装版本 第二步&#xff1a;下载php_sqlsrv 驱动 安装解压后&#xff0c;会有对应php版本的驱动文件&#xf…

草图一键生成静态网页,看看这个开源项目

借助GPT-4V视觉模型&#xff0c;可以轻松的将一张草图生成一个静态页面。现在这已经不是什么稀奇事了。主要是分享一下它的Prompt&#xff0c;很简单&#xff0c;用户画好草图后&#xff0c;将草图保存成png图片&#xff0c;传给GPT-4V&#xff0c;然后GPT返回一个标准的HTML&a…

Navicat for mysql 无法连接到虚拟机的linux系统下的mysql

原创/朱季谦 最近在linux Centos7版本的虚拟机上安装了一个MySql数据库&#xff0c;发现本地可以正常ping通虚拟机&#xff0c;但Navicat则无法正常连接到虚拟机里的MySql数据库&#xff0c;经过一番琢磨&#xff0c;发现解决这个问题的方式&#xff0c;很简单&#xff0c;总共…

9.MyBatis-Plus

1、前期准备 a. 创建数据库 CREATE TABLE USER (id BIGINT(20)NOT NULL COMMENT 主键ID,NAME VARCHAR(30)NULL DEFAULT NULL COMMENT 姓名,age INT(11)NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50)NULL DEFAULT NULL COMMENT 邮箱,PRIMARY KEY (id) );INSERT INTO user…

亚马逊云科技云存储服务指南

文章作者&#xff1a;Libai 高效的云存储服务对于现代软件开发中的数据管理至关重要。亚马逊云科技云存储服务提供了强大的工具&#xff0c;可以简化工作流程并增强数据管理能力。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏…

常见的业务分析方法

树状结构分析 由于数据维度的丰富性&#xff0c;不知从哪个维度开始分析&#xff0c;如果每个维度都尝试下探非常耗时。这时可以考虑从总体指标入手&#xff0c;逐层分解总体指标&#xff0c;形成下钻式结构。 分析思路如下&#xff1a; 梳理行业内常见指标&#xff1b;将指…

【Proteus仿真】【51单片机】锂电池管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602显示模块、DS18B20温度传感器、PCF8691 ADC模块、按键、LED蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示温度…

如何做到百万数据半小时跑批结束

什么是跑批 跑批就是应用程序定时对数据的批量处理。 跑批有以下特性&#xff1a; 大数据量&#xff1a;批量任务一般伴随着大量的数据处理 自动化&#xff1a;要求制定时间或频率自动运行 性能&#xff1a;要求在指定时间内完成批处理任务 健壮性&#xff1a;针对于异常数…