Java反射获取Android系统属性值

目录

  • 目录
  • 反射定义
  • 为何需要反射
  • 反射方法Method
    • getDeclaredMethod方法
    • getMethod方法
    • 参数解释
    • invoke方法
  • Android 反射应用

反射定义

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


为何需要反射

反射带来的好处包括:

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

反射方法Method


getDeclaredMethod方法

声明如下:

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

解释:

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

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

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

注意

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


getMethod方法

声明如下:

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

解释:

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

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

2. parameterTypes:是一个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源码中查看一下这个类:

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);
    }
}

可以看到,这个前面有一个@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;
    }

}
时间: 2024-10-27 08:28:21

Java反射获取Android系统属性值的相关文章

java反射获取对象的属性值和对象属性中的子属性值

近段时间在做web项目,前端使用的是jQuery EasyUI. 为方便需要,准备做一个前端通用的Datagird导出Excel功能,博主也考虑过思路和最终功能,1.前端选中行导出:2.当前页导出:3.当前过滤条件导出. 想偷懒在网上找找已有的代码改改,发现大部分只能满足个别需求,使用JS导出只能满足前端,使用代码才能实现3功能. ...... 好了,说了一堆废话,回归正题,本文是在做通用自定义字段导出时所需要,根据属性名去查找对象和子对象,找到对应属性值,抓取回来放到Excel中. 直接上代码

反射获取对象的属性值

1 > bean 对象 package com.whbs.bean; public class UserBean { private Integer id ; private int age ; private String name ; private String address ; public UserBean(){ System. out .println( " 实例化 " ); } public Integer getId() { return id ; } publ

java 反射 - 获取成员变量的值.

通过反射,可以获取所有声明的成员变量(包括所有的),代码如下: package spt.test.src; public class Person { private String name = "pri_name"; public String id; } 运行测试: package spt.test; import java.lang.reflect.Field; import spt.test.src.Person; class ReflectionTest { @Suppres

Java代码获取所有系统属性

Properties props = System.getProperties();           Iterator<Entry<Object, Object>> it = props.entrySet().iterator();         while(it.hasNext()) {             Entry<Object, Object> ent = it.next();             System.out.println(ent.ge

反射获取运行时属性值的替代方法

方法一:表达式树 1         public static Dictionary<string, Func<T, object>> InitDic<T>() 2         { 3             Dictionary<string, Func<T, object>> model = new Dictionary<string, Func<T, object>>(); 4             var 

Android 系统属性

/************************************************************************ * Android 系统属性 * 说明: * 由于需求中需要获取Android系统属性,所以查了点资料,以及验证了一下 * 怎么使用. * * 2016-6-4 深圳 南山平山村 曾剑锋 ***********************************************************************/ 一.参考文章: A

Java反射获取对象VO的属性值(通过Getter方法)

有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个Excel导出的工具类,导出的批量数据是以List类型传入的,List里的对象自然每次都不同,这取决于需要导出什么信息. 为了使用方便,将对象的属性名与属性值存于Map当中,使用时就可以直接遍历Map了. 此次的思路是通过反射和Getter方法取得值,然后记录在一个Map当中. Kick start

通过java反射获取任意对象的字段名及字段值

import java.lang.reflect.Field; public class ReflectClass3 { /** * @param args */ public static void main(String[] args) { Person p = new Person(1, "ctl", true, 'c', 2.0f, 2.0, 1L, (short) 1, (byte) 1); p.setId(0); p.setName("张三"); p.s

关于获取Android系统所有已安装App信息的一些操作(详细)

转载请注明出处:http://blog.csdn.net/qinjuning       本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:  第一部分: 获取应用程序的packagename.label.icon等 :             第二部分:获取应用程序的占用大小,包括:缓存大小(cachsize).数据大小(datasize). 每部分都为您准备了简单丰富的实例,您一定不会错过.