当前位置:   article > 正文

Java反射获取Android系统属性值_android获取ro.product.model

android获取ro.product.model


反射定义

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


为何需要反射

反射带来的好处包括:

  1. 在运行时检测对象的类型。
  2. 动态构造某个类的对象。
  3. 检测类的属性和方法。
  4. 任意调用对象的方法。
  5. 修改构造函数、方法、属性的可见性。

反射方法Method


getDeclaredMethod方法

声明如下:

public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
   
   
  • 1
  • 1
  • 1

解释:

返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法。 
1. name : 是一个String,它指定所需方法的简称。 
2. parameterTypes:是一个Class对象的变长数组,它按声明顺序标识该方法的形参类型

注意: 
getDeclaredMethod获取该类声明的public方法或者protected方法,但是不包括继承的方法。


getMethod方法

声明如下:

public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
   
   
  • 1
  • 1
  • 1

解释:

返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定公共成员方法。 
1. name : 是一个String,它指定所需方法的简称。 
2. parameterTypes:是一个Class对象的变长数组,它按声明顺序标识该方法的形参类型


参数解释

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

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

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

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

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

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

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


invoke方法

声明如下:

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

解释:

Method类的invoke(Object obj, Object… args)方法接收的参数必须为对象。其中: 
1. obj : 从中调用底层方法的对象。 
2. args :用于方法调用的参数。


Android 反射应用

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

  1. package android.os;
  2. import java.util.ArrayList;
  3. import android.util.Log;
  4. /**
  5. * Gives access to the system properties store. The system properties
  6. * store contains a list of string key-value pairs.
  7. *
  8. * {@hide}
  9. */
  10. public class SystemProperties
  11. {
  12. // 省略具体实现代码
  13. /**
  14. * Get the value for the given key.
  15. * @return an empty string if the key isn't found
  16. * @throws IllegalArgumentException if the key exceeds 32 characters
  17. */
  18. public static String get(String key) {
  19. if (key.length() > PROP_NAME_MAX) {
  20. throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
  21. }
  22. return native_get(key);
  23. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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

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

  1. import java.lang.reflect.InvocationTargetException;
  2. import java.lang.reflect.Method;
  3. import android.util.Log;
  4. public class SystemProperties {
  5. public static String get(String key) {
  6. String value = "";
  7. Class<?> cls = null;
  8. try {
  9. cls = Class.forName("android.os.SystemProperties");
  10. Method hideMethod = cls.getMethod("get", String.class);
  11. Object object = cls.newInstance();
  12. value = (String) hideMethod.invoke(object, key);
  13. } catch (ClassNotFoundException e) {
  14. Log.e("zhengyi.wzy", "get error() ", e);
  15. } catch (NoSuchMethodException e) {
  16. Log.e("zhengyi.wzy", "get error() ", e);
  17. } catch (InstantiationException e) {
  18. Log.e("zhengyi.wzy", "get error() ", e);
  19. } catch (IllegalAccessException e) {
  20. Log.e("zhengyi.wzy", "get error() ", e);
  21. } catch (IllegalArgumentException e) {
  22. Log.e("zhengyi.wzy", "get error() ", e);
  23. } catch (InvocationTargetException e) {
  24. Log.e("zhengyi.wzy", "get error() ", e);
  25. }
  26. return value;
  27. }
  28. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/242347
推荐阅读
相关标签
  

闽ICP备14008679号