android获取php的值,Java反射获取Android系统属性值

目录

目录

反射定义

为什么需要反射

反射方法MethodgetDeclaredMethod方法

getMethod方法

参数解释

invoke方法

Android 反射利用

反射定义

“反射”(Reflection)能够让运行于JVM中的程序检测和修改运行时的行动。

为什么需要反射

反射带来的好处包括:

在运行时检测对象的类型。

动态构造某个类的对象。

检测类的属性和方法。

任意调用对象的方法。

修改构造函数、方法、属性的可见性。

反射方法Method

getDeclaredMethod方法

声明以下:

public Method getDeclaredMethod(String name, Class>... parameterTypes) throws NoSuchMethodException, SecurityException

解释:

返回1个Method对象,该对象反应此Class对象所表示的类或接口的指定已声明方法。

1. name : 是1个String,它指定所需方法的简称。

2. parameterTypes:是1个Class对象的变长数组,它按声明顺序标识该方法的形参类型。

注意:

getDeclaredMethod获得该类声明的public方法或protected方法,但是不包括继承的方法。

getMethod方法

声明以下:

public Method getMethod(String name, Class>... parameterTypes) throws NoSuchMethodException, SecurityException

解释:

返回1个Method对象,该对象反应此Class对象所表示的类或接口的指定公共成员方法。

1. name : 是1个String,它指定所需方法的简称。

2. parameterTypes:是1个Class对象的变长数组,它按声明顺序标识该方法的形参类型。

参数解释

name参数就不需要解释了,就是调用类的方法名称。

可能很多同学刚接触这个方法的时候,会对parameterTypes参数产生疑问,例如这个参数为何是Class泛型变长数组,其实举个例子就很好理解了。

假定我们要反射的方法有4个参数,函数原型以下:

public void printInfo(String str, int iNum, double dNum, long i);

那我们通过返回获得这个Method对象的时候,传的parameterTypes以下所示:

getMethod("printInfo", String.class, int.class, double.class, long.class);

所以,parameterTypes其实就是对方法形参的类型抽象。

invoke方法

声明以下:

public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

解释:

Method类的invoke(Object obj, Object… args)方法接收的参数必须为对象。其中:

1. obj : 从中调用底层方法的对象。

2. args :用于方法调用的参数。

Android 反射利用

我们知道,Android有些类是没有在SDK中开放的,例如你需要获得系统属性,需要调用到SystemProperties类的get方法,但是这个类并没有在SDK中公然,我们可以在Android源码中查看1下这个类:

package android.os;

import java.util.ArrayList;

import android.util.Log;

/**

* Gives access to the system properties store. The system properties

* store contains a list of string key-value pairs.

*

* {@hide}

*/

public class SystemProperties

{

// 省略具体实现代码

/**

* Get the value for the given key.

*@return an empty string if the key isn't found

*@throws IllegalArgumentException if the key exceeds 32 characters

*/

public static String get(String key) {

if (key.length() > PROP_NAME_MAX) {

throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);

}

return native_get(key);

}

可以看到,这个前面有1个@hide标签,所以这个类是没法直接在代码中调用的。

但是,在Android利用中,很多时候我们需要获得得手机类型属性(ro.product.model)。所以,这个时候,我们就需要在利用层反射SystemProperties类,调用get方法。具体实现源码以下:

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import android.util.Log;

public class SystemProperties {

public static String get(String key) {

String value = "";

Class> cls = null;

try {

cls = Class.forName("android.os.SystemProperties");

Method hideMethod = cls.getMethod("get", String.class);

Object object = cls.newInstance();

value = (String) hideMethod.invoke(object, key);

} catch (ClassNotFoundException e) {

Log.e("zhengyi.wzy", "get error() ", e);

} catch (NoSuchMethodException e) {

Log.e("zhengyi.wzy", "get error() ", e);

} catch (InstantiationException e) {

Log.e("zhengyi.wzy", "get error() ", e);

} catch (IllegalAccessException e) {

Log.e("zhengyi.wzy", "get error() ", e);

} catch (IllegalArgumentException e) {

Log.e("zhengyi.wzy", "get error() ", e);

} catch (InvocationTargetException e) {

Log.e("zhengyi.wzy", "get error() ", e);

}

return value;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值