`

Java反射

阅读更多
本人菜鸟,今天恰好有时间,写写博客,总结复习一下java反射方面的知识,欢迎大家探讨交流学习指教

首先看看java中的Class
package demo;

public class ClassTest {
	
	/*先了解java中的Class*/
	
	public static void main(String[] args) {
		
    //任何一个类都是Class的实例对象,这个实例对象有3种表示方式
		
	//01方式     及任何一个类都有一个隐含的静态成员变量class
	Class c1 = Foo.class;
	
	//02方式     已知该类的对象通过getClass方法
	Foo foo = new Foo();
	Class c2 = foo.getClass();
	
	/*c1、c2表示了Foo的类类型(class type)*/
	
	System.out.println(c1==c2);//控制台将显示true  说明:c1 ,c2 都表示了Foo类的类类型
	
	//03方式  
	Class c3 = null;
	try {
		c3 = Class.forName("demo.Foo");//动态加载
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	System.out.println(c2==c3);//控制台将显示true  说明:c2 ,c3s 都表示了Foo类的类类型
	
	
	//接下来我们通过c1,c2,c3的方式创建Foo的实例
	try {
		Foo f = (Foo)c1.newInstance();
		f.say();//运行将打印  哈哈哈
	} catch (InstantiationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}
}
class Foo{
	void say(){
		System.out.println("哈哈哈");
	}
}


接着我们来看看获得某个类的信息(成员方法,成员变量,构造函数)
package demo;

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

public class GetInformationOfClassUtil {

	/** 
	 *获得某个类的信息(成员方法,成员变量,构造函数) 
	 * @param  obj
	 * */
	public static void getInformation(Object obj){
		
		//第一步, 获得类的类型
		Class c = obj.getClass();//传递的是哪个子类的对象,c就是哪个子类的类类型
		
		//第二步, 获得类的名称
		String className = c.getName();
		System.out.println(className+"类的所有方法");
		
		//第三步, 获得方法名称及返回值及参数
		/*此处说明:注意Method类,可称作方法对象
		 * c.getMethods() 获得的是所有public的方法,包括从父类继承而来的方法
		 * c.getDeclaredAnnotations() 获得的是所有该类自己声明的全部访问权限的方法
		 * */
		Method[] methods = c.getMethods();
		for (Method method : methods) {
			
			Class  returnType = method.getReturnType();//方法的返回值类类型
			String returnClassName = returnType.getName();//方法的返回值类类型的名称
			
			String methodName = method.getName();//方法名称
			
			System.out.print(returnClassName+"   "+methodName+"(");
			
			Class[] parameterTypes = method.getParameterTypes();//获得参数列表的类类型
			for (Class class1 : parameterTypes) {
				System.out.print(class1.getName()+",");//每个参数的类类型的名称
			}
			System.out.println(")");
		}
		
		
		
		
		System.out.println("所有的成员变量");
		//第四步, 获得成员变量
		/*注:成员变量也是对象(java.lang.reflect.Field)
		 * c.getFields() 获得的是所有public的成员变量的信息
		 * c.getDeclaredFields() 获得是是该类自己所有的成员变量的信息
		 * */
		Field[] fields = c.getDeclaredFields();
		for (Field field : fields) {
			
			Class fieldType = field.getClass();//得到成员变量的类类型
			String fieldTypeName = fieldType.getName();//得到成员变量的类类型名称
			
			System.out.println(field.getName());
		}
		
		
		
		System.out.println("所有的构造函数");
		/*构造函数或者称呼为构造方法也是对象(java.lang.Constructor)
		 * c.getConstructors() 获得所有public的构造函数
		 * c.getDeclaredConstructors();  获得的是所有的构造函数
		 * */
		Constructor[] Constructors = c.getConstructors();
		for (Constructor constructor : Constructors) {
			String constructorName = constructor.getName();
			System.out.print(constructorName+"(");
			//构造函数的参数列表
			Class[] parmTypes = constructor.getParameterTypes();
			for (Class class1 : parmTypes) {
				String parmTypeName = class1.getName();
				System.out.print(parmTypeName+",");
			}
			System.out.println(")");
		}
	}
	
	
	
	//接下来我们来测试获得String类的信息
	public static void main(String[] args) {
		String s = "";
		GetInformationOfClassUtil.getInformation(s);
		
		//测试结果如下
		
		/*java.lang.String类的所有方法
		 *  int   hashCode()
			int   compareTo(java.lang.Object,)
			int   compareTo(java.lang.String,)
			int   indexOf(java.lang.String,int,)
			int   indexOf(java.lang.String,)
			int   indexOf(int,)
			int   indexOf(int,int,)
			boolean   equals(java.lang.Object,)
			java.lang.String   toString()
			char   charAt(int,)
			int   codePointAt(int,)
			int   codePointBefore(int,)
			int   codePointCount(int,int,)
			int   compareToIgnoreCase(java.lang.String,)
			java.lang.String   concat(java.lang.String,)
			boolean   contains(java.lang.CharSequence,)
			boolean   contentEquals(java.lang.StringBuffer,)
			boolean   contentEquals(java.lang.CharSequence,)
			java.lang.String   copyValueOf([C,int,int,)
			java.lang.String   copyValueOf([C,)
			boolean   endsWith(java.lang.String,)
			boolean   equalsIgnoreCase(java.lang.String,)
			java.lang.String   format(java.lang.String,[Ljava.lang.Object;,)
			java.lang.String   format(java.util.Locale,java.lang.String,[Ljava.lang.Object;,)
			[B   getBytes(java.nio.charset.Charset,)
			[B   getBytes()
			[B   getBytes(java.lang.String,)
			void   getBytes(int,int,[B,int,)
			void   getChars(int,int,[C,int,)
			java.lang.String   intern()
			boolean   isEmpty()
			int   lastIndexOf(java.lang.String,)
			int   lastIndexOf(int,)
			int   lastIndexOf(int,int,)
			int   lastIndexOf(java.lang.String,int,)
			int   length()
			boolean   matches(java.lang.String,)
			int   offsetByCodePoints(int,int,)
			boolean   regionMatches(int,java.lang.String,int,int,)
			boolean   regionMatches(boolean,int,java.lang.String,int,int,)
			java.lang.String   replace(char,char,)
			java.lang.String   replace(java.lang.CharSequence,java.lang.CharSequence,)
			java.lang.String   replaceAll(java.lang.String,java.lang.String,)
			java.lang.String   replaceFirst(java.lang.String,java.lang.String,)
			[Ljava.lang.String;   split(java.lang.String,int,)
			[Ljava.lang.String;   split(java.lang.String,)
			boolean   startsWith(java.lang.String,int,)
			boolean   startsWith(java.lang.String,)
			java.lang.CharSequence   subSequence(int,int,)
			java.lang.String   substring(int,)
			java.lang.String   substring(int,int,)
			[C   toCharArray()
			java.lang.String   toLowerCase()
			java.lang.String   toLowerCase(java.util.Locale,)
			java.lang.String   toUpperCase()
			java.lang.String   toUpperCase(java.util.Locale,)
			java.lang.String   trim()
			java.lang.String   valueOf([C,)
			java.lang.String   valueOf(int,)
			java.lang.String   valueOf(long,)
			java.lang.String   valueOf(float,)
			java.lang.String   valueOf(double,)
			java.lang.String   valueOf(java.lang.Object,)
			java.lang.String   valueOf(char,)
			java.lang.String   valueOf([C,int,int,)
			java.lang.String   valueOf(boolean,)
			void   wait()
			void   wait(long,int,)
			void   wait(long,)
			java.lang.Class   getClass()
			void   notify()
			void   notifyAll()
			
			所有的成员变量
			value
			offset
			count
			hash
			serialVersionUID
			serialPersistentFields
			CASE_INSENSITIVE_ORDER
			
			所有的构造函数
			java.lang.String()
			java.lang.String(java.lang.String,)
			java.lang.String([C,)
			java.lang.String([C,int,int,)
			java.lang.String([I,int,int,)
			java.lang.String([B,int,int,int,)
			java.lang.String([B,int,)
			java.lang.String(java.lang.StringBuilder,)
			java.lang.String([B,int,int,java.lang.String,)
			java.lang.String([B,int,int,java.nio.charset.Charset,)
			java.lang.String([B,java.lang.String,)
			java.lang.String([B,java.nio.charset.Charset,)
			java.lang.String([B,int,int,)
			java.lang.String([B,)
			java.lang.String(java.lang.StringBuffer,)

		 * 
		 * */
	}
}

最后我们来看看方法的反射操作
package demo;

import java.lang.reflect.Method;

public class refectOfMethod {
	
	public static void main(String[] args) {
		/*
		 * 方法的反射操作 如何获得某一个方法(注:方法的名称和参数列表决定了方法和其他方法的区别)
		 * 例如:获取work(int,int)方法;分析:要获得一个方法也就是必须先要获得该类得信息,也就是要先获得该类的类类型
		 */
		Auto auto = new Auto();
		Class c = auto.getClass();
		/* 接下来,根据方法名称,参数列表来决定获取的方法
		 注:c.getMethod(name, parameterTypes); 获得的是所有public的方法,包括从父类继承而来的方法
		    c.getDeclaredMethod(name, parameterTypes); 获得的是所有该类自己声明的全部访问权限的方法
		 */
		
		//调用方法01
		try {
			Method method = c.getMethod("work",new Class[]{int.class,int.class});
			//或者Method method = c.getMethod("work",int.class,int.class);
			//方法的反射,及用method对象来进行方法的调用了,而不是使用auto.work()这种方式调用了
			method.invoke(auto,2,4);//此处等同于method.invoke(auto,new Object[]{2,4});或者auto.work(2,4);
		} catch (Exception e) {
			e.printStackTrace();
	  }
		
		
		//调用方法02
		try {
			Method method2 = c.getMethod("work",new Class[]{String.class,String.class});
			//或者Method method = c.getMethod("work",int.class,int.class);
			//方法的反射,及用method对象来进行方法的调用了,而不是使用auto.work()这种方式调用了
			method2.invoke(auto,"hello","word");//此处等同于method.invoke(auto,new Object[]{"hello","word");或者auto.work("hello","word");
		} catch (Exception e) {
			e.printStackTrace();
		}
			
		
		//调用方法03
		try {
			Method method2 = c.getMethod("work");
			//或者Method method = c.getMethod("work",int.class,int.class);
			//方法的反射,及用method对象来进行方法的调用了,而不是使用auto.work()这种方式调用了
			method2.invoke(auto);//此处等同于method.invoke(auto);或者auto.work();
			} catch (Exception e) {
				e.printStackTrace();
		}
			
			
	}
}

class Auto{
	//方法01
	public void work(int a,int b){System.out.println(a+b);}
	//方法02
	public String work(String a,String b){
		System.out.println(a+b);
	    return a+b;}
	//方法03
	public void work(){System.out.println("哈哈");}
}


分享到:
评论

相关推荐

    大华无插件播放项目111

    大华无插件播放项目111

    Oracle 19c 数据库备份恢复与导入导出实战指南

    内容概要:本文详细介绍了Oracle 19c数据库的备份恢复和导入导出操作。首先概述了基本命令,然后分别讲述了三种工作方式(交互式、命令行、参数文件)和三种模式(表、用户、全库)。接着介绍了高级选项,如分割成多个文件、增量导出/导入、以SYSDBA进行导出/导入、表空间传输等。最后讨论了优化技巧,包括加快导出和导入速度的方法。还解决了一些常见问题,如字符集问题和版本问题。 适用人群:Oracle数据库管理员和相关技术人员。 使用场景及目标:适合在日常数据库管理和维护中进行数据备份、恢复、导入和导出操作,提高数据安全性和管理效率。 其他说明:文章内容丰富,涉及多种实用技巧,适用于不同场景下的具体操作,有助于提升工作效率。

    大数据旅游酒店大数据可视化项目

    基于Python Flask开发的旅游酒店大数据可视化项目,可以直接运行。 操作步骤: 1. 解压缩项目文件 2. 使用 pycharm打开项目 3. 运行项目中的app.py文件 注意:需要确保项目的Flask Python相关的环境已经搭建完成。

    模拟立体翻转效果,非Gallery实现.zip

    Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    仿360 浮动小插件效果.zip

    Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告

    基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告,个人高分设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的学生和需要项目实战练习的学习者。 基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告个人高分设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的学生和需要项目实战练习的学习者。 个人高分设计项目、经导师指导并认可通过的高分设

    棉花检测20-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    棉花检测20-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar棉-V2释放 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 它包括406张图像。 以可可格式注释棉花。 将以下预处理应用于每个图像: 没有应用图像增强技术。

    javaweb社区医院挂号系统-lw.zip

    项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!

    python-3.11.11-amd64.exe

    windwos环境下python 3.11系列64位安装包,仅推荐个人学习、开发、娱乐或者测试环境下使用。

    基于ssm的精品酒销售管理系统+jsp源代码(完整前后端+mysql+说明文档+LW).zip

    使用精品酒销售管理系统的用户分管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有:主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等。 用户可以实现主页、个人中心、我的收藏管理、订单管理等。 前台首页可以实现商品信息、新闻资讯、我的、跳转到后台、购物车等。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    Video_2024-12-18_000023.wmv

    Video_2024-12-18_000023.wmv

    ppt最終版asasaadd

    ppt最終版asasaadd

    计算机图形学试卷第一套

    计算机图形学期末考试

    springboot-基于SpringBootVue的家具商城系统设计与实现.zip

    springboot-基于SpringBootVue的家具商城系统设计与实现.zip

    PenTablet_5.2.4-5.zip

    PenTablet_5.2.4-5.zip

    基于ssm的企业人力资源管理系统源代码(完整前后端+mysql+说明文档+LW).zip

    考虑了企业管理者的实际工作环境和需求,最终将人力资源系统划分为5个部分,即登录模块、组织发展模块、员工团队模块、合同管理模块、党建管理模块。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    QT5.12.9音乐播放器MP3 免费下载交流学习

    QT音乐播放器MP3 可点击播放可上一首下一首可调节音量 可暂停可上传音乐

    椅子检测6-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    椅子检测6-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar对象检测实验室-V1 2023-08-21 2:28 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括997张图像。 对象以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 应用以下扩展来创建每个源图像的3个版本: *将盐和胡椒噪声应用于10%的像素

    Python项目-实例-13 截图工具.zip

    Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    Altas PF拧紧枪 OP协议,开发协议

    Altas PF拧紧枪 OP协议,开发协议

Global site tag (gtag.js) - Google Analytics