Java反射机制浅析图+应用实例

Java反射机制浅析图+应用实例

——转载请注明出处:coder-pig

本节引言:

其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的

视频教程觉得不错,又复习了一下,今天面试了一下午,回来就不想写代码了,就写写关于Java

反射的总结,写些简单的使用例子,最后找了2个Android中反射机制应用的例子,分别是

旧版本SDK利用AIDL + Java反射机制接听与挂断电话以及利用反射机制通过按钮关闭

对话框,后续如果用到会另外总结~

本节正文:

1.反射的相关概念图:

2.简单的使用示例:

我们写个简单的例子来理解Java反射机制的使用,其实就是通过Class类的相关方法实现而已!

我们先定义一个一个用来做演示的类:Test.java:

package com.jay.test;

public class Test {

	private String s1;
	public int i1;
	public static float PI = 3.14159f;

	public Test() {
		System.out.println("我是无参的构造方法");
	}

	public Test(String s1) {
		super();
		this.s1 = s1;
		System.out.println("我是有一个参数的构造方法");
	}

	public Test(String s1,int i1)
	{
		System.out.println("我是有两个参数的构造方法");
	}

	public void sum(int a,int b)
	{
		System.out.println("a+b = "+(a+b));
	}

}

①获取某个类的相关信息:

	public static void getTheClass()
	{
		Class class1 = Test.class;
		System.out.println(class1.getName());
		System.out.println(class1.getSimpleName());
	}

运行截图:

②获取构造方法:

获取构造方法就要通过Constructor这个API了:

提供四种可供调用的方法:

Constructor getConstructor(Class[] params)
-- 获得使用特殊的参数类型的公共构造函数, 

Constructor[] getConstructors( ) -- 获得类的所有公共构造函数 

Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关) 

Constructor[] getDeclaredConstructors( )
-- 获得类的所有构造函数(与接入级别无关) 

代码示例:

	public static void getConstructor()
	{
		Class class1 = Test.class;
		Constructor[] cs = class1.getDeclaredConstructors();
		for(Constructor constructor:cs)
		{
			System.out.print(constructor.getName() + "(");
			//获取构造函数的参数列表的对应数据类型:
			Class[] ParamTypes = constructor.getParameterTypes();
			for(Class class2:ParamTypes)
			{
				System.out.print(class2.getSimpleName() + ",");
			}
			System.out.println(")");
		}
	}

运行截图:

③获取成员变量:

获取相关的成员变量则要用到Field这个API了:

也是提供了四种可供调用的方法:

Field getField(String name) -- 获得命名的公共字段 

Field[] getFields( ) -- 获得类的所有公共字段 

Field getDeclaredField(String name) -- 获得类声明的命名的字段 

Field[] getDeclaredFields( )
-- 获得类声明的所有字段 

代码示例:

	public static void getField()
	{
		Class class1 = Test.class;
		Field[] fields = class1.getFields();
		for(Field field:fields)
		{
			//得到成员变量的数据类型
			Class fieldType = field.getType();
			String TypeName = fieldType.getName();
			//获得成员变量的参数名称
			String filedName = field.getName();
			System.out.println(TypeName+" "+filedName);
		}
	}

运行截图:

④获得相关方法:

获取类中的相关方法就需要用到Method这个API了:

同样也是提供了四个可供调用的方法:

Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法 

Method[] getMethods( )
-- 获得类的所有公共方法 

Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法 

Method[] getDeclaredMethods( )
-- 获得类声明的所有方法,不考略权限 

代码示例:

①获得类中所有的公共方法:

	public static void getMethod()
	{
		Class class1 = Test.class;
		Method[] methods = class1.getMethods();
		for(int i = 0;i < methods.length;i++)
		{
			//获取方法返回值
			Class returnType = methods[i].getReturnType();
			System.out.print(returnType.getName() + " ");
			//获得方法名称
			System.out.print(methods[i].getName() + "(");
			//获取参数列表
			Class[] paramTypes = methods[i].getParameterTypes();
			for(Class class2:paramTypes)
			{
				System.out.print(class2.getName() + ",");
			}
			System.out.println(")");
		}
	}

运行截图:

除了我们自定义的方法外,我们还看到了一些其他的方法,他们是父类提供的一些方法~

②利用反射调用相关方法:

代码示例:

	public static void useMethod()throws Exception
	{
		Test test = new Test();
		Class class1 = test.getClass();
		Method method = class1.getMethod("sum", int.class,int.class);
		Object object = method.invoke(test, new Object[]{11,22});
	}

运行截图:

当然调用该方法的时候别忘了捕获异常哦!

3.Android中使用反射实例:

关于在Android中的反射机制的一些实例,比如:Android 在1.1版本后就把接听与挂断的API给隐藏

了,我们就可以通过AIDL + 反射机制来调用ITelephony中的相关方法,鉴于篇幅,时间关系这里就

不详细演示讲解,关于Android中反射机制的例子可参考下述资料:

①Android接听与挂断电话的实现:

http://blog.sina.com.cn/s/blog_5da93c8f0101g4wb.html

②利用反射机制通过按钮关闭对话框:

http://blog.csdn.net/nokiaguy/article/details/5770263

ps:另外,貌似Android 4.1后上述接听电话的方法就不可以了,高版本的解决方法如下:

http://bbs.51cto.com/thread-1078059-1.html

好了,关于Java反射浅析就暂时了解到这里吧,后续遇到相关的再mark~

时间: 2024-08-01 22:45:33

Java反射机制浅析图+应用实例的相关文章

Java反射机制可以动态修改实例中final修饰的成员变量吗?

问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. 2. 当final修饰的成员变量在定义的时候并没有初始化值的话,那么就还能通过java反射机制来动态修改它的值. 实验: 1. 当final修饰的成员变量在定义的时候就初始化了值 1 public Class Person { 2 private final String name = "damon

Java反射机制浅析

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用

Java 反射机制浅析

转:http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html ———————————————————————————————————————————————— Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制.反射的概念是由Smith在1982年首次提出的,主要是指程序可以

Java反射机制大神必学系列之 ,高级与低级的差别在哪里?

Java反射机制大神必学系列之 ,高级与低级的差别在哪里?java学习爱好者 2019-05-20 19:08前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文Java反射机制定义 Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.

Java知识总结:Java反射机制(用实例理解)

概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java中的反射是一个强大的工具,他能够创建灵活的代码,这些 代码可以在运行时装配,无需在组件之间进行链接,发射允许在编写和执行时,使程序代码能够接入装载到 JVM 中的类的内部信息 .而不是源代码中选定的类协作的代码.这使发射

浅析Java反射机制

一.反射的理解 反射类似于我们平时见到的平面镜的反射:被反射的目标(任意一个已知名称的类),反射出来的"镜像"(我们的类对象<Java中任意一个类都对应有一个类对象>),通过这个"镜像",类对象,我们就可以在运行时获取任意一个已知名称的类对应的信息. 二.Java反射机制提供的功能 Java反射机制主要提供了以下功能:在运行时判断任意一个独享所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方

java反射机制(转)

一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制         有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,     Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成     驱动对象实例

Java反射机制1

一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制         有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,     Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成     驱动对象实例

[转]java反射机制

原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制         有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,     Class.forName("com.mysql.