`

Android反射机制实例

 
阅读更多
对程序员来说,放假只是换了一个写代码的地方!
看一下Java(Android)里面的反射怎么用:
一、先来定义两个类(一个父类,一个子类):
package com.zwq.test;

public abstract class Person {

	String name = "";
	private int age = 0;
	public int fPubVar = 0;

	abstract void getPhone();

	public Person() {
		System.out.println("I am Farther");
	}

	int myAge() {
		return 50;
	}

	String myName() {
		return "Father";
	}

	public void callSun() {
		getPhone();
		priMethod(25);
	}

	private void priMethod(Integer a) {
		age = a;
		System.out.println("I am priMethod , Dont call me! age " + age);
	}

	/**
	 * @hide
	 */
	public void hideMethod(String name) {
		System.out.println("I am hideMethod , Dont call me! name:" + name
				+ "   age:" + age);
	}
}



package com.zwq.test;

import java.util.Observable;
import java.util.Observer;

public class Man extends Person implements Observer {

	private int age = 0;
	private String var1 = "I am var1";
	public int var2 = 20;

	public Man() {
		System.out.println("I am Man" + var1);
		age = 20;
	}

	public int myAge() {
		return 28;
	}

	public String myName() {
		return "Jerome";
	}
	
	private void getName(){
		System.out.println("I am Jerome");
	}
	
	/**
	 *@hide 
	 */
	private void getAge(){
		System.out.println("I am "+age);
	}

	@Override
	void getPhone() {
		System.out.println("I am sun , My age is " + age + "___" + var2);
	}

	@Override
	public void update(Observable o, Object arg) {

	}
}



以上两个类只是为了测试,不用关心具体实现代码,只要知道有private变量和方法,protected变量和方法,public变量和方法。重点在下面:

二、利用反射,调用上面的类:

package com.zwq.test;

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

public class Main {
	public static void main(String[] args) {
		getInfo();
		callSpuerMethod();
		callCurrentMethod();
		callOtherMethod();
	}

	static void getInfo() {
		Man r = new Man();
		Class<?> temp = r.getClass();
		try {
			System.out.println("反射类中所有公有的属性");
			Field[] fb = temp.getFields();
			for (int j = 0; j < fb.length; j++) {
				Class<?> cl = fb[j].getType();
				System.out.println("fb:" + cl + "___" + fb[j].getName());
			}
			System.out.println("反射类中所有的属性");
			Field[] fa = temp.getDeclaredFields();
			for (int j = 0; j < fa.length; j++) {
				Class<?> cl = fa[j].getType();
				System.out.println("fa:" + cl + "____" + fa[j].getName());
			}

			System.out.println("反射类中所有的方法");
			Method[] fm = temp.getMethods();
			for (int i = 0; i < fm.length; i++) {
				System.out.println("fm:" + fm[i].getName() + "____"
						+ fm[i].getReturnType().getName());
			}

			System.out.println("反射类中所有的接口");
			Class<?>[] fi = temp.getInterfaces();
			for (int i = 0; i < fi.length; i++) {
				System.out.println("fi:" + fi[i].getName());
			}

			System.out.println("反射类中私有属性的值");
			Field f = temp.getDeclaredField("var1");
			f.setAccessible(true);
			String i = (String) f.get(r);
			System.out.println(i);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 修复父类变量,调用父类方法
	 */
	static void callSpuerMethod() {
		Man r = new Man();
		try {
			// 修改私有变量;
			Field f = r.getClass().getSuperclass().getDeclaredField("age");
			f.setAccessible(true);
			f.set(r, 20);

			// 调用私有方法,必须要用getDeclaredMethod,而不能用getMethod;
			Method mp = r.getClass().getSuperclass()
					.getDeclaredMethod("priMethod", Integer.class);
			mp.setAccessible(true);
			mp.invoke(r, 18);

			// 调用隐藏方法
			Method m = r.getClass().getSuperclass()
					.getMethod("hideMethod", String.class);
			m.setAccessible(true);
			m.invoke(r, "Jerome");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 修复子类变量,调用子类方法
	 */
	static void callCurrentMethod() {
		Man r = new Man();
		try {
			// 修改私有变量;
			Field f = r.getClass().getDeclaredField("age");
			f.setAccessible(true);
			f.set(r, 20);

			// 调用私有方法,必须要用getDeclaredMethod,而不能用getMethod;
			Method mp = r.getClass().getDeclaredMethod("getName");
			mp.setAccessible(true);
			mp.invoke(r);

			// 调用隐藏私有方法
			Method m = r.getClass().getDeclaredMethod("getAge");
			m.setAccessible(true);
			m.invoke(r);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 用Class.forName加载类及实例化
	 */
	static void callOtherMethod() {
		try {
			// Class.forName(xxx.xx.xx) 返回的是一个类, .newInstance() 后才创建一个对象
			// Class.forName(xxx.xx.xx) 的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
			Class<?> cl = Class.forName("com.zwq.test.Man");
			Object r = cl.newInstance();

			// 修改私有变量;
			Field f = cl.getDeclaredField("age");
			f.setAccessible(true);
			f.set(r, 20);

			// 调用私有方法,必须要用getDeclaredMethod,而不能用getMethod;
			Method mp = cl.getDeclaredMethod("getName");
			mp.setAccessible(true);
			mp.invoke(r);

			// 调用隐藏私有方法
			Method m = cl.getDeclaredMethod("getAge");
			m.setAccessible(true);
			m.invoke(r);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}




三、最后贴一个Android里面的具体事例:

/**
	 * 获得包的大小
	 * 
	 * @param pkgName
	 * @throws Exception
	 */
	public void queryPacakgeSize(String pkgName) throws Exception {
		if (pkgName != null) {
			// 使用放射机制得到PackageManager类的隐藏函数getPackageSizeInfo
			PackageManager pm = getPackageManager(); // 得到pm对象
			try {
				// 通过反射机制获得该隐藏函数
				Method getPackageSizeInfo = pm.getClass().getDeclaredMethod(
						"getPackageSizeInfo", String.class,
						IPackageStatsObserver.class);
				// 调用该函数,并且给其分配参数 ,待调用流程完成后会回调PkgSizeObserver类的函数
				getPackageSizeInfo.invoke(pm, pkgName, new PkgSizeObserver());
				// 停止主线程让PackageStats对象获得数据
				Thread.sleep(8);
			} catch (Exception ex) {
				// Log.e("TAG", "NoSuchMethodException") ;
				ex.printStackTrace();
				throw ex;// 抛出异常
			}
		}
	}

关于反射的使用,基本就这些了,代码注释已经很详细了,就不需要多余的说明了,想了解反射的原理,建议大家看源码!
参考:http://www.cnblogs.com/crazypebble/archive/2011/04/13/2014582.html
0
0
分享到:
评论

相关推荐

    android 反射机制 简单示例

    下面是一个简单的Android反射机制示例: 首先,定义一个简单的类`Person`,包含一个私有字段`name`和一个私有方法`sayHello()`: ```java public class Person { private String name; private void sayHello()...

    android系统java反射机制详解

    在Android系统中,Java反射机制同样被广泛应用,尤其是在动态加载类、处理不确定类型的对象、调用私有方法或者访问私有变量等方面。下面将深入探讨Java反射机制的概念、原理及在Android开发中的应用。 一、Java反射...

    java反射机制的原理及在Android下的简单应用

    ### Java反射机制的原理及在Android下的简单应用 #### 一、Java反射机制的基本概念 反射(Reflection)是指程序在运行时能够访问、检测和修改它自身的能力。这种能力使得程序能够动态地获取自身的结构信息并操作...

    Android 通过反射启动未安装的APK中的Activity

    在Android系统中,反射机制是一种强大的编程技巧,它允许运行时动态访问类、接口、字段和方法,即使这些元素在编译时未知。通过反射,我们可以执行一些在常规编程中无法实现的操作,例如启动未安装的APK中的Activity...

    反射机制在Android开发中的应用.pdf

    《反射机制在Android开发中的应用》 随着Android系统在智能手机领域的普及,越来越多的开发者投身于Android应用开发。至2013年,Android市场应用数量已达到80万,但在开发过程中,有时会遇到API限制导致优秀的软件...

    通过反射获取Context实例的Demo

    当我们需要在非Activity或非Service类中使用Context时,可以通过各种方式获取,其中之一就是利用Java的反射机制。本示例"通过反射获取Context实例的Demo"将展示如何在没有直接Context引用的情况下,通过反射来获取...

    MyReflectionTest:学习android反射机制

    在Android开发中,反射机制是一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地调用方法或访问私有成员。本项目"MyReflectionTest"专注于探索和理解Android环境下的Java...

    Java高级特性之反射机制实例详解

    Java反射机制是Java语言的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java具备了高度的灵活性和强大的元编程能力。在Java中,反射主要涉及以下几个方面: 1. **创建类的实例**: - ...

    android通过反射获取内置存储、SD、OTG盘的路径,适合三方apk存储查看与文件管理

    总之,通过反射机制,开发者可以在不依赖特定厂商实现的情况下,获取并管理Android设备上的各种存储路径,包括内置存储、SD卡和OTG设备,同时获取到它们的空间信息,以适应不同的设备环境。在`MountRootManagerRf....

    Java反射机制的学习

    在Android应用开发中,反射机制尤其重要,因为某些系统类或方法被Google用`@hide`注解隐藏,无法直接在SDK中使用,反射提供了访问这些隐藏功能的途径。 要使用Java反射,首先需要获取到`Class`对象,这是反射操作的...

    Android 插件开发 实例

    这涉及到Android的ClassLoader机制,通过自定义ClassLoader来加载外部的插件APK,使得主应用能够识别并运行插件中的类。此外,还需要处理好权限、进程、上下文(Context)等关键问题,确保插件与宿主应用能够无缝协作...

    Java反射机制测试Demo

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类包括`Class`、`Field`、`Method`和`Constructor`等,它们分别代表...

    Android反射的使用demo

    这个“Android反射的使用demo”旨在展示如何利用Java反射机制来增强应用的功能和灵活性。下面将详细探讨反射的核心概念以及如何在Android环境中应用它们。 一、反射基础 1. 类与对象:反射的核心是Class类,它代表...

    java反射实现javabean转json实例代码.docx

    ### Java反射机制实现JavaBean转JSON的详细解析 #### 一、引言 在现代软件开发过程中,数据格式转换是一项非常常见的任务。特别是在处理不同系统之间的数据交换时,JSON(JavaScript Object Notation)因其轻量级...

    android listview 自反射 adapter

    在这个示例中,我们探讨的是如何利用Java的反射机制自动生成Adapter,从而避免手动编写基于BaseAdapter的子类。反射是Java语言中一个强大的特性,允许程序在运行时检查类、接口、字段和方法的信息,并可以动态调用...

    Java反射机制的原理及在Android下的简单应用[归纳].pdf

    在Android开发中,反射机制有着广泛的应用,尤其是在处理框架内部逻辑、插件化开发、API兼容性等问题时。 一、反射的基本概念 反射的核心在于`java.lang.Class`类,它是所有Java类的元数据类,提供了获取类信息...

    原生平台反射机制的消息处理-原工程

    总结来说,这个“原生平台反射机制的消息处理-原工程”是关于在CocosCreator项目中如何利用反射机制处理原生平台消息的一个实例。通过理解这一机制,开发者可以更好地整合JavaScript和原生代码,实现更高效、更灵活...

    Android 下通过反射调用加载/卸载(mount/unmount) 外置SD卡

    总的来说,通过反射调用加载和卸载外置SD卡是一种深入Android系统层面的操作,需要对系统内部机制有深入理解,并且需要注意安全性和权限问题。在实际开发中,除非有特殊需求,否则不推荐频繁使用这种方式。

    Android反射完全解析--强势来袭

    "Android反射完全解析--强势来袭"这个主题深入探讨了如何利用Java的反射机制来增强Android应用的功能和灵活性。反射使得我们能够在程序运行过程中动态地获取类的信息,并能调用私有方法,访问私有变量,甚至执行不...

Global site tag (gtag.js) - Google Analytics