文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

详解Java编程中的反射在Android开发中的应用

2022-06-06 09:56

关注

反射定义

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

反射带来的好处包括:

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

反射方法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;

public class SystemProperties
{
  // 省略具体实现代码
  
 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;
 }
}
您可能感兴趣的文章:Android依据名字通过反射获取在drawable中的图片java反射android的r文件的示例Android通过反射实现强制停止应用程序的方法Android基于反射技术实现的加减乘除运算示例Android中通过反射实现圆角ImageView代码实例android换肤功能 如何动态获取控件中背景图片的资源id?Android使用getIdentifier()获取资源Id的方法Android中实现根据资源名获取资源IDAndroid编程实现通过反射获取资源Id的方法


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯