对程序员来说,放假只是换了一个写代码的地方!
看一下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
分享到:
相关推荐
下面是一个简单的Android反射机制示例: 首先,定义一个简单的类`Person`,包含一个私有字段`name`和一个私有方法`sayHello()`: ```java public class Person { private String name; private void sayHello()...
在Android系统中,Java反射机制同样被广泛应用,尤其是在动态加载类、处理不确定类型的对象、调用私有方法或者访问私有变量等方面。下面将深入探讨Java反射机制的概念、原理及在Android开发中的应用。 一、Java反射...
### Java反射机制的原理及在Android下的简单应用 #### 一、Java反射机制的基本概念 反射(Reflection)是指程序在运行时能够访问、检测和修改它自身的能力。这种能力使得程序能够动态地获取自身的结构信息并操作...
在Android系统中,反射机制是一种强大的编程技巧,它允许运行时动态访问类、接口、字段和方法,即使这些元素在编译时未知。通过反射,我们可以执行一些在常规编程中无法实现的操作,例如启动未安装的APK中的Activity...
《反射机制在Android开发中的应用》 随着Android系统在智能手机领域的普及,越来越多的开发者投身于Android应用开发。至2013年,Android市场应用数量已达到80万,但在开发过程中,有时会遇到API限制导致优秀的软件...
当我们需要在非Activity或非Service类中使用Context时,可以通过各种方式获取,其中之一就是利用Java的反射机制。本示例"通过反射获取Context实例的Demo"将展示如何在没有直接Context引用的情况下,通过反射来获取...
在Android开发中,反射机制是一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地调用方法或访问私有成员。本项目"MyReflectionTest"专注于探索和理解Android环境下的Java...
Java反射机制是Java语言的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java具备了高度的灵活性和强大的元编程能力。在Java中,反射主要涉及以下几个方面: 1. **创建类的实例**: - ...
总之,通过反射机制,开发者可以在不依赖特定厂商实现的情况下,获取并管理Android设备上的各种存储路径,包括内置存储、SD卡和OTG设备,同时获取到它们的空间信息,以适应不同的设备环境。在`MountRootManagerRf....
在Android应用开发中,反射机制尤其重要,因为某些系统类或方法被Google用`@hide`注解隐藏,无法直接在SDK中使用,反射提供了访问这些隐藏功能的途径。 要使用Java反射,首先需要获取到`Class`对象,这是反射操作的...
这涉及到Android的ClassLoader机制,通过自定义ClassLoader来加载外部的插件APK,使得主应用能够识别并运行插件中的类。此外,还需要处理好权限、进程、上下文(Context)等关键问题,确保插件与宿主应用能够无缝协作...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类包括`Class`、`Field`、`Method`和`Constructor`等,它们分别代表...
这个“Android反射的使用demo”旨在展示如何利用Java反射机制来增强应用的功能和灵活性。下面将详细探讨反射的核心概念以及如何在Android环境中应用它们。 一、反射基础 1. 类与对象:反射的核心是Class类,它代表...
### Java反射机制实现JavaBean转JSON的详细解析 #### 一、引言 在现代软件开发过程中,数据格式转换是一项非常常见的任务。特别是在处理不同系统之间的数据交换时,JSON(JavaScript Object Notation)因其轻量级...
在这个示例中,我们探讨的是如何利用Java的反射机制自动生成Adapter,从而避免手动编写基于BaseAdapter的子类。反射是Java语言中一个强大的特性,允许程序在运行时检查类、接口、字段和方法的信息,并可以动态调用...
在Android开发中,反射机制有着广泛的应用,尤其是在处理框架内部逻辑、插件化开发、API兼容性等问题时。 一、反射的基本概念 反射的核心在于`java.lang.Class`类,它是所有Java类的元数据类,提供了获取类信息...
总结来说,这个“原生平台反射机制的消息处理-原工程”是关于在CocosCreator项目中如何利用反射机制处理原生平台消息的一个实例。通过理解这一机制,开发者可以更好地整合JavaScript和原生代码,实现更高效、更灵活...
总的来说,通过反射调用加载和卸载外置SD卡是一种深入Android系统层面的操作,需要对系统内部机制有深入理解,并且需要注意安全性和权限问题。在实际开发中,除非有特殊需求,否则不推荐频繁使用这种方式。
"Android反射完全解析--强势来袭"这个主题深入探讨了如何利用Java的反射机制来增强Android应用的功能和灵活性。反射使得我们能够在程序运行过程中动态地获取类的信息,并能调用私有方法,访问私有变量,甚至执行不...