1. 什么是反射机制?
  2.  
  3. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制(注意关键词:运行状态)换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods
  4. 反射机制主要提供的功能
  5.  
  6. 在运行时判断任意一个对象所属的类;
  7. 在运行时构造任意一个类的对象;
  8. 在运行时判断任意一个类所具有的成员变量和方法;
  9. 在运行时调用任意一个对象的方法;
  10.  
  11. java Reflection API简介
  12.  
  13. Class类:代表一个类,位于java.lang包下
  14. Field类:代表类的成员变量(成员变量也称为类的属性)
  15. Method类:代表类的方法
  16. Constructor类:代表类的构造方法
  17. Array类:提供了动态创建数组,以及访问数组的元素的静态方法
  18.  
  19. java中的Class介绍
  20.  
  21. Class 类十分特殊,它没有共有的构造方法,被jvm调用的(简单的理解:new对象或者被类加载器加载的时候),在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
  22. java中的Class三种获取方式
  23.  
  24. 利用对象调用getClass()方法获取该对象的Class实例;
  25. 使用Class类的静态方法forName(),用类的名字获取一个Class实例
  26. 运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例;
  27.  
  28. 说明:在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。
  29.  
  30. //方式一
  31. Person person = new Person();
  32. Class<? extends Person> personClazz01 = person.getClass();
  33.  
  34. //方式二
  35. try {
  36. Class<?> personClazz02 = Class.forName("Person");
  37. } catch (ClassNotFoundException e) {
  38. e.printStackTrace();
  39. }
  40.  
  41. //方式三
  42. Class<? extends Person> personClazz03 = Person.class;
  43.  
  44. java中的Class中一些重要的方法
  45.  
  46. public Annotation[] getAnnotations () 获取这个类中所有注解
  47.  
  48. getClassLoader() 获取加载这个类的类加载器
  49.  
  50. getDeclaredMethods() 获取这个类中的所有方法
  51.  
  52. getReturnType() 获取方法的返回类型
  53.  
  54. getParameterTypes() 获取方法的传入参数类型
  55.  
  56. isAnnotation() 测试这类是否是一个注解类
  57.  
  58. getDeclaredConstructors() 获取所有的构造方法
  59.  
  60. getDeclaredMethod(String name, Class parameterTypes) 获取指定的构造方法(参数:参数类型.class
  61.  
  62. getSuperclass() 获取这个类的父类
  63.  
  64. getInterfaces() 获取这个类实现的所有接口
  65.  
  66. getFields() 获取这个类中所有被public修饰的成员变量
  67.  
  68. getField(String name) 获取指定名字的被public修饰的成员变量
  69.  
  70. newInstance() 返回此Class所表示的类,通过调用默认的(即无参数)构造函数创建的一个新实例
  71.  
  72. 等等方法
  73. 如何通过反射获取私有成员变量和私有方法
  74.  
  75. Person
  76.  
  77. /**
  78. * Created by yuanyc on 2016/1/28.
  79. */
  80. public class Person {
  81. private String name = "zhangsan";
  82. private String age;
  83.  
  84. public String getName() {
  85. return name;
  86. }
  87.  
  88. public void setName(String name) {
  89. this.name = name;
  90. }
  91. }
  92.  
  93. Person person = new Person();
  94. //打印没有改变属性之前的name值
  95. System.out.println("before:" + getPrivateValue(person, "name"));
  96. person.setName("lisi");
  97. //打印修改之后的name值
  98. System.out.println("after:" + getPrivateValue(person, "name"));
  99.  
  100. /**
  101. * 通过反射获取私有的成员变量
  102. *
  103. * @param person
  104. * @return
  105. */
  106. private Object getPrivateValue(Person person, String fieldName) {
  107.  
  108. try {
  109. Field field = person.getClass().getDeclaredField(fieldName);
  110. // 参数值为true,打开禁用访问控制检查
  111. //setAccessible(true) 并不是将方法的访问权限改成了public,而是取消java的权限控制检查。
  112. //所以即使是public方法,其accessible 属相默认也是false
  113. field.setAccessible(true);
  114. return field.get(person);
  115. } catch (Exception e) {
  116. e.printStackTrace();
  117. }
  118. return null;
  119. }
  120.  
  121. 运行结果:
  1.  
  2. 获取私有方法的方式类似获取私有成员变量的方式
  3. Filed类,Method类等详细查看开发者文档:
  4. http://developer.android.com/intl/zh-cn/reference/java/lang/reflect/Field.html
  5. 案例演示反射
  6.  
  7. Person
  8.  
  9. /**
  10. * kaivens
  11. */
  12. public class Person {
  13. private int age;
  14. private String name;
  15. public Person(){
  16.  
  17. }
  18. public Person(int age, String name){
  19. this.age = age;
  20. this.name = name;
  21. }
  22.  
  23. public int getAge() {
  24. return age;
  25. }
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29. public String getName() {
  30. return name;
  31. }
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35.  
  36. }
  37.  
  38. SuperPerson
  39.  
  40. /**
  41. * kaivens
  42. */
  43. public class SuperPerson extends Person implements Smoke.Smoking{
  44. private boolean isMan;
  45.  
  46. public void fly()
  47. {
  48. System.out.println("走你~~");
  49. }
  50.  
  51. public boolean isMan() {
  52. return isMan;
  53. }
  54. public void setMan(boolean iaMan) {
  55. isMan = iaMan;
  56. }
  57. @Override
  58. public void smoke(int count) {
  59.  
  60. }
  61. }
  62.  
  63. Smoke接口类
  64.  
  65. /**
  66. * kaivens
  67. */
  68. public class Smoke {
  69. public interface Smoking {
  70. public void smoke(int count);
  71. }
  72. }
  73.  
  74. MainActivity
  75.  
  76. public class MainActivity extends Activity {
  77.  
  78. @Override
  79. protected void onCreate(Bundle savedInstanceState) {
  80. super.onCreate(savedInstanceState);
  81. setContentView(R.layout.activity_main);
  82. Tests();
  83. }
  84.  
  85. private void Tests() {
  86. try {
  87. //通过Java反射机制得到类的包名和类名
  88. Test1();
  89. System.out.println("===============================================");
  90.  
  91. //验证所有的类都是Class类的实例对象
  92. Test2();
  93. System.out.println("===============================================");
  94.  
  95. //通过Java反射机制,用Class 创建类对象[这也就是反射存在的意义所在],无参构造
  96. Test3();
  97. System.out.println("===============================================");
  98.  
  99. //通过Java反射机制得到一个类的构造函数,并实现构造带参实例对象
  100. Test4();
  101. System.out.println("===============================================");
  102.  
  103. //通过Java反射机制操作成员变量, set 和 get
  104. Test5();
  105. System.out.println("===============================================");
  106.  
  107. //通过Java反射机制得到类的一些属性: 继承的接口,父类,函数信息,成员信息,类型等
  108. Test6();
  109. System.out.println("===============================================");
  110.  
  111. //通过Java反射机制调用类中方法
  112. Test7();
  113. System.out.println("===============================================");
  114.  
  115. //通过Java反射机制获得类加载器
  116. Test8();
  117. System.out.println("===============================================");
  118. } catch (Exception e) {
  119. e.printStackTrace();
  120. }
  121. }
  122.  
  123. /**
  124. * Demo1: 通过Java反射机制得到类的包名和类名
  125. */
  126. public static void Test1() {
  127. Person person = new Person();
  128. System.out.println("Test1: 包名: " + person.getClass().getPackage().getName() + "," + "完整类名: " + person.getClass().getName());
  129. }
  130.  
  131. /**
  132. * Demo2: 验证所有的类都是Class类的实例对象
  133. */
  134. public static void Test2() throws ClassNotFoundException {
  135. //定义两个类型都未知的Class , 设置初值为null, 看看如何给它们赋值成Person类
  136. Class<?> class1 = null;
  137. Class<?> class2 = null;
  138.  
  139. //写法1, 可能抛出 ClassNotFoundException [多用这个写法]
  140. class1 = Class.forName("com.tuba.yuanyc.audiomanagerdemo.Person");
  141. System.out.println("Test2:(写法1) 包名: " + class1.getPackage().getName() + "," + "完整类名: " + class1.getName());
  142.  
  143. //写法2
  144. class2 = Person.class;
  145. System.out.println("Test2:(写法2) 包名: " + class2.getPackage().getName() + "," + "完整类名: " + class2.getName());
  146. }
  147.  
  148. /**
  149. * Demo3: 通过Java反射机制,用Class 创建类对象[这也就是反射存在的意义所在]
  150. */
  151. public static void Test3() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
  152. Class<?> class1 = null;
  153. class1 = Class.forName("com.android.reflect.Person");
  154. //由于这里不能带参数,所以你要实例化的这个类Person,一定要有无参构造函数
  155. Person person = (Person) class1.newInstance();
  156. person.setAge(26);
  157. person.setName("kaiven");
  158. System.out.println("Test3: " + person.getName() + " : " + person.getAge());
  159. }
  160.  
  161. /**
  162. * Demo4: 通过Java反射机制得到一个类的构造函数,并实现创建带参实例对象
  163. */
  164. public static void Test4() throws ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
  165. Class<?> class1 = null;
  166. Person person1 = null;
  167. Person person2 = null;
  168.  
  169. class1 = Class.forName("com.android.reflect.Person");
  170. //得到一系列构造函数集合
  171. Constructor<?>[] constructors = class1.getConstructors();
  172.  
  173. try {
  174. person1 = (Person) constructors[0].newInstance();
  175. } catch (InvocationTargetException e) {
  176. e.printStackTrace();
  177. }
  178. person1.setAge(28);
  179. person1.setName("zhuk");
  180.  
  181. person2 = (Person) constructors[1].newInstance(29, "zhuk");
  182.  
  183. System.out.println("Test4: " + person1.getName() + " : " + person1.getAge() + " , " + person2.getName() + " : " + person2.getAge());
  184.  
  185. }
  186.  
  187. /**
  188. * Demo5: 通过Java反射机制操作成员变量, set 和 get
  189. */
  190. public static void Test5() throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException, InstantiationException, ClassNotFoundException {
  191. Class<?> class1 = null;
  192. class1 = Class.forName("com.android.reflect.Person");
  193. Object obj = class1.newInstance();
  194.  
  195. Field nameField = class1.getDeclaredField("name");
  196. nameField.setAccessible(true);
  197. nameField.set(obj, "cyy");
  198.  
  199. System.out.println("Test5: 修改属性之后得到属性变量的值:" + nameField.get(obj));
  200.  
  201. }
  202.  
  203. /**
  204. * Demo6: 通过Java反射机制得到类的一些属性: 继承的接口,父类,函数信息,成员信息,类型等
  205. */
  206. public static void Test6() throws ClassNotFoundException {
  207. Class<?> class1 = null;
  208. class1 = Class.forName("com.android.reflect.Person");
  209.  
  210. //取得父类名称
  211. Class<?> superClass = class1.getSuperclass();
  212. System.out.println("Test6: SuperMan类的父类名: " + superClass.getName());
  213.  
  214. System.out.println("===============================================");
  215.  
  216. Field[] fields = class1.getDeclaredFields();
  217. for (int i = 0; i < fields.length; i++) {
  218. System.out.println("类中的成员: " + fields[i]);
  219. }
  220. System.out.println("===============================================");
  221.  
  222. //取得类方法
  223. Method[] methods = class1.getDeclaredMethods();
  224. for (int i = 0; i < methods.length; i++) {
  225. System.out.println("Test6,取得SuperMan类的方法:");
  226. System.out.println("函数名:" + methods[i].getName());
  227. System.out.println("函数返回类型:" + methods[i].getReturnType());
  228. System.out.println("函数访问修饰符:" + Modifier.toString(methods[i].getModifiers()));
  229. System.out.println("函数代码写法: " + methods[i]);
  230. }
  231.  
  232. System.out.println("===============================================");
  233.  
  234. Class<?> interfaces[] = class1.getInterfaces();
  235. for (int i = 0; i < interfaces.length; i++) {
  236. System.out.println("实现的接口类名: " + interfaces[i].getName());
  237. }
  238.  
  239. }
  240.  
  241. /**
  242. * Demo7: 通过Java反射机制调用类方法
  243. */
  244. public static void Test7() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
  245. Class<?> class1 = null;
  246. class1 = Class.forName("com.android.reflect.SuperPerson");
  247.  
  248. System.out.println("Test7: \n调用无参方法fly():");
  249. Method method = class1.getMethod("fly");
  250. method.invoke(class1.newInstance());
  251.  
  252. System.out.println("调用有参方法smoke(int m):");
  253. method = class1.getMethod("smoke", int.class);
  254. method.invoke(class1.newInstance(), 100);
  255. }
  256.  
  257. /**
  258. * Demo8: 通过Java反射机制得到类加载器信息
  259. * <p/>
  260. * 在java中有三种类类加载器。
  261. * <p/>
  262. * 1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。
  263. * <p/>
  264. * 2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类
  265. * <p/>
  266. * 3)AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。
  267. *
  268. * @throws ClassNotFoundException
  269. */
  270. public static void Test8() throws ClassNotFoundException {
  271. Class<?> class1 = null;
  272. class1 = Class.forName("com.android.reflect.SuperPerson");
  273. String name = class1.getClassLoader().getClass().getName();
  274.  
  275. System.out.println("Test8: 类加载器类名: " + name);
  276. }
  277. }
  278.  
  279. 运行结果:
  280.  
  281. 01-28 17:19:29.463 14972-14972/? I/System.out Test1: 包名: com.tuba.yuanyc.audiomanagerdemo,完整类名: com.tuba.yuanyc.audiomanagerdemo.Person
  282. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  283. 01-28 17:19:29.463 14972-14972/? I/System.out Test2:(写法1) 包名: com.android.reflect,完整类名: com.tuba.yuanyc.audiomanagerdemo.Person
  284. 01-28 17:19:29.463 14972-14972/? I/System.out Test2:(写法2) 包名: com.android.reflect,完整类名: com.tuba.yuanyc.audiomanagerdemo.Person
  285. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  286. 01-28 17:19:29.463 14972-14972/? I/System.out Test3: zhuk : 26
  287. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  288. 01-28 17:19:29.463 14972-14972/? I/System.out Test4: yyc : 28 , yyc : 29
  289. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  290. 01-28 17:19:29.463 14972-14972/? I/System.out Test5: 修改属性之后得到属性变量的值:cyy
  291. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  292. 01-28 17:19:29.463 14972-14972/? I/System.out Test6: SuperMan类的父类名: java.lang.Object
  293. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  294. 01-28 17:19:29.463 14972-14972/? I/System.out 类中的成员: private java.lang.String com.tuba.yuanyc.audiomanagerdemo.Person.name
  295. 01-28 17:19:29.463 14972-14972/? I/System.out 类中的成员: private int com.android.reflect.Person.age
  296. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  297. 01-28 17:19:29.463 14972-14972/? I/System.out Test6,取得SuperMan类的方法:
  298. 01-28 17:19:29.463 14972-14972/? I/System.out 函数名:getAge
  299. 01-28 17:19:29.463 14972-14972/? I/System.out 函数返回类型:int
  300. 01-28 17:19:29.463 14972-14972/? I/System.out 函数访问修饰符:public
  301. 01-28 17:19:29.463 14972-14972/? I/System.out 函数代码写法: public int com.tuba.yuanyc.audiomanagerdemo.Person.getAge()
  302. 01-28 17:19:29.463 14972-14972/? I/System.out Test6,取得SuperMan类的方法:
  303. 01-28 17:19:29.463 14972-14972/? I/System.out 函数名:getName
  304. 01-28 17:19:29.463 14972-14972/? I/System.out 函数返回类型:class java.lang.String
  305. 01-28 17:19:29.463 14972-14972/? I/System.out 函数访问修饰符:public
  306. 01-28 17:19:29.463 14972-14972/? I/System.out 函数代码写法: public java.lang.String com.tuba.yuanyc.audiomanagerdemo.Person.getName()
  307. 01-28 17:19:29.463 14972-14972/? I/System.out Test6,取得SuperMan类的方法:
  308. 01-28 17:19:29.463 14972-14972/? I/System.out 函数名:setAge
  309. 01-28 17:19:29.463 14972-14972/? I/System.out 函数返回类型:void
  310. 01-28 17:19:29.463 14972-14972/? I/System.out 函数访问修饰符:public
  311. 01-28 17:19:29.463 14972-14972/? I/System.out 函数代码写法: public void com.tuba.yuanyc.audiomanagerdemo.Person.setAge(int)
  312. 01-28 17:19:29.463 14972-14972/? I/System.out Test6,取得SuperMan类的方法:
  313. 01-28 17:19:29.463 14972-14972/? I/System.out 函数名:setName
  314. 01-28 17:19:29.463 14972-14972/? I/System.out 函数返回类型:void
  315. 01-28 17:19:29.463 14972-14972/? I/System.out 函数访问修饰符:public
  316. 01-28 17:19:29.463 14972-14972/? I/System.out 函数代码写法: public void com.tuba.yuanyc.audiomanagerdemo.Person.setName(java.lang.String)
  317. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  318. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  319. 01-28 17:19:29.463 14972-14972/? I/System.out Test7:
  320. 01-28 17:19:29.463 14972-14972/? I/System.out 调用无参方法fly():
  321. 01-28 17:19:29.463 14972-14972/? I/System.out 走你~~
  322. 01-28 17:19:29.463 14972-14972/? I/System.out 调用有参方法smoke(int m):
  323. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  324. 01-28 17:19:29.463 14972-14972/? I/System.out Test8: 类加载器类名: dalvik.system.PathClassLoader
  325. 01-28 17:19:29.463 14972-14972/? I/System.out ===============================================
  326.  
  327. 利用反射使用系统隐藏类
  328.  
  329. 因为SystemProperties.java类已被系统隐藏,因此我们通过Java反射机制获取该类内容,通过getset方法来读取、设置build.prop里面的内容。
  330.  
  331. package com.android.kaiven.tools;
  332.  
  333. import android.content.Context;
  334. import android.util.Log;
  335.  
  336. import java.io.File;
  337. import java.io.IOException;
  338. import java.lang.reflect.Method;
  339.  
  340. import dalvik.system.DexFile;
  341.  
  342. /**
  343. * Created by zhangqing on 2017/3/1.
  344. */
  345. public class SystemPropertiesProxy {
  346. public static final String TAG = "SystemPropertiesProxy";
  347.  
  348. /**
  349. * 根据给定的Key返回String类型的值
  350. *
  351. * @param context 上下文
  352. * @param key 获取指定信息所需的key
  353. * @return 返回一个String类型的值,如果不存在该key则返回空字符串
  354. */
  355. public static String getString(Context context, String key) {
  356. String result = "";
  357. try {
  358. ClassLoader classLoader = context.getClassLoader();
  359. @SuppressWarnings("rawtypes")
  360. Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
  361. //参数类型
  362. @SuppressWarnings("rawtypes")
  363. Class[] paramTypes = new Class[1];
  364. paramTypes[0] = String.class;
  365. Method getString = SystemProperties.getMethod("get", paramTypes);
  366. //参数
  367. Object[] params = new Object[1];
  368. params[0] = new String(key);
  369.  
  370. result = (String) getString.invoke(SystemProperties, params);
  371. } catch (IllegalArgumentException e) {
  372. //e.printStackTrace();
  373. //如果key超过32个字符则抛出该异常
  374. Log.w(TAG, "key超过32个字符");
  375. } catch (Exception e) {
  376. result = "";
  377. }
  378. return result;
  379. }
  380.  
  381. /**
  382. * 根据给定的Key返回String类型的值
  383. *
  384. * @param context 上下文
  385. * @param key 获取指定信息所需的key
  386. * @param def key不存在时的默认值
  387. * @return 返回一个String类型的值,如果key不存在, 并且如果def不为null则返回def,否则返回空字符串
  388. */
  389. public static String getString(Context context, String key, String def) {
  390. String result = def;
  391. try {
  392. ClassLoader classLoader = context.getClassLoader();
  393. @SuppressWarnings("rawtypes")
  394. Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
  395. //参数类型
  396. @SuppressWarnings("rawtypes")
  397. Class[] paramTypes = new Class[2];
  398. paramTypes[0] = String.class;
  399. paramTypes[1] = String.class;
  400. Method getString = SystemProperties.getMethod("get", paramTypes);
  401. //参数
  402. Object[] params = new Object[2];
  403. params[0] = new String(key);
  404. params[1] = new String(def);
  405.  
  406. result = (String) getString.invoke(SystemProperties, params);
  407. } catch (IllegalArgumentException e) {
  408. //e.printStackTrace();
  409. //如果key超过32个字符则抛出该异常
  410. Log.w(TAG, "key超过32个字符");
  411. } catch (Exception e) {
  412. result = def;
  413. }
  414. return result;
  415. }
  416.  
  417. /**
  418. * 根据给定的key返回int类型的值
  419. *
  420. * @param context 上下文
  421. * @param key 要查询的key
  422. * @param def 默认返回值
  423. * @return 返回一个int类型的值,如果没有发现则返回默认值 def
  424. */
  425. public static Integer getInt(Context context, String key, int def) {
  426. Integer result = def;
  427. try {
  428. ClassLoader classLoader = context.getClassLoader();
  429. @SuppressWarnings("rawtypes")
  430. Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
  431. //参数类型
  432. @SuppressWarnings("rawtypes")
  433. Class[] paramTypes = new Class[2];
  434. paramTypes[0] = String.class;
  435. paramTypes[1] = int.class;
  436. Method getInt = SystemProperties.getMethod("getInt", paramTypes);
  437. //参数
  438. Object[] params = new Object[2];
  439. params[0] = new String(key);
  440. params[1] = new Integer(def);
  441. result = (Integer) getInt.invoke(SystemProperties, params);
  442. } catch (IllegalArgumentException e) {
  443. //e.printStackTrace();
  444. //如果key超过32个字符则抛出该异常
  445. Log.w(TAG, "key超过32个字符");
  446. } catch (Exception e) {
  447. result = def;
  448. }
  449. return result;
  450. }
  451.  
  452. /**
  453. * 根据给定的key返回long类型的值
  454. *
  455. * @param context 上下文
  456. * @param key 要查询的key
  457. * @param def 默认返回值
  458. * @return 返回一个long类型的值,如果没有发现则返回默认值def
  459. */
  460. public static Long getLong(Context context, String key, long def) {
  461. Long result = def;
  462. try {
  463. ClassLoader classLoader = context.getClassLoader();
  464. @SuppressWarnings("rawtypes")
  465. Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
  466. //参数类型
  467. @SuppressWarnings("rawtypes")
  468. Class[] paramTypes = new Class[2];
  469. paramTypes[0] = String.class;
  470. paramTypes[1] = long.class;
  471. Method getLong = SystemProperties.getMethod("getLong", paramTypes);
  472. //参数
  473. Object[] params = new Object[2];
  474. params[0] = new String(key);
  475. params[1] = new Long(def);
  476. result = (Long) getLong.invoke(SystemProperties, params);
  477. } catch (IllegalArgumentException e) {
  478. //e.printStackTrace();
  479. //如果key超过32个字符则抛出该异常
  480. Log.w(TAG, "key超过32个字符");
  481. } catch (Exception e) {
  482. result = def;
  483. }
  484. return result;
  485. }
  486.  
  487. /**
  488. * 根据给定的key返回boolean类型的值
  489. * 如果值为'n','no','0','false' or 'off'返回false
  490. * 如果值为'y','yes','1','true' or 'on'返回true
  491. * 如果key不存在, 或者是其它的值, 则返回默认值
  492. *
  493. * @param context 上下文
  494. * @param key 要查询的key
  495. * @param def 默认返回值
  496. * @return 返回一个boolean类型的值,如果没有发现则返回默认值def
  497. */
  498. public static Boolean getBoolean(Context context, String key, boolean def) {
  499. Boolean result = def;
  500. try {
  501. ClassLoader classLoader = context.getClassLoader();
  502. @SuppressWarnings("rawtypes")
  503. Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
  504. //参数类型
  505. @SuppressWarnings("rawtypes")
  506. Class[] paramTypes = new Class[2];
  507. paramTypes[0] = String.class;
  508. paramTypes[1] = boolean.class;
  509. Method getBoolean = SystemProperties.getMethod("getBoolean", paramTypes);
  510. //参数
  511. Object[] params = new Object[2];
  512. params[0] = new String(key);
  513. params[1] = new Boolean(def);
  514. result = (Boolean) getBoolean.invoke(SystemProperties, params);
  515. } catch (IllegalArgumentException e) {
  516. //e.printStackTrace();
  517. //如果key超过32个字符则抛出该异常
  518. Log.w(TAG, "key超过32个字符");
  519. } catch (Exception e) {
  520. result = def;
  521. }
  522. return result;
  523. }
  524.  
  525. /**
  526. * 根据给定的key和值设置属性, 该方法需要特定的权限才能操作.
  527. *
  528. * @param context 上下文
  529. * @param key 设置属性的key
  530. * @param val 设置属性的value
  531. */
  532. public static void set(Context context, String key, String val) {
  533. try {
  534. @SuppressWarnings("rawtypes")
  535. DexFile df = new DexFile(new File("/system/app/Settings.apk"));
  536. ClassLoader classLoader = context.getClassLoader();
  537. @SuppressWarnings("rawtypes")
  538. Class SystemProperties = Class.forName("android.os.SystemProperties");
  539. //参数类型
  540. @SuppressWarnings("rawtypes")
  541. Class[] paramTypes = new Class[2];
  542. paramTypes[0] = String.class;
  543. paramTypes[1] = String.class;
  544. Method set = SystemProperties.getMethod("set", paramTypes);
  545. //参数
  546. Object[] params = new Object[2];
  547. params[0] = new String(key);
  548. params[1] = new String(val);
  549. set.invoke(SystemProperties, params);
  550. } catch (IllegalArgumentException e) {
  551. //e.printStackTrace();
  552. //如果key超过32个字符或者value超过92个字符则抛出该异常
  553. Log.w(TAG, "key超过32个字符或者value超过92个字符");
  554. } catch (Exception e) {
  555. e.printStackTrace();
  556. }
  557. }
  558. }
  559.  
  560. 相关文章:https://www.jianshu.com/p/6277c1f9f48d
  561.  
  562. 参考文献
  563.  
  564. http://www.cnblogs.com/mengdd/archive/2013/01/26/2877972.html
  565. http://developer.android.com/intl/zh-cn/reference/java/lang/Class.html
  566. http://blog.csdn.net/ljphhj/article/details/12858767
  567. http://blog.sina.com.cn/s/blog_59ca2c2a0100gqdn.html

Android反射机制:手把手教你实现反射的更多相关文章

  1. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

  2. Android开发之手把手教你写ButterKnife框架(二)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开 ...

  3. Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  4. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  5. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  6. Android开发之手把手教你写ButterKnife框架(一)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52662376 本文出自:[余志强的博客] 一.概述 JakeWhar ...

  7. Android 自定义ViewGroup手把手教你实现ArcMenu

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这 ...

  8. 转 Android 多线程:手把手教你使用AsyncTask

    转自:https://www.jianshu.com/p/ee1342fcf5e7 前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread类 实现Runnable接口 ...

  9. 小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

    前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代 ...

随机推荐

  1. Hadoop讲解

    1.简介 Hadoop是一款开源的大数据通用处理平台,其提供了分布式存储和分布式离线计算,适合大规模数据.流式数据(写一次,读多次),不适合低延时的访问.大量的小文件以及频繁修改的文件. *Hadoo ...

  2. Docker企业级仓库Harbor的安装配置与使用

    Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Docker Distribution.作为一个企业级 ...

  3. 利用maven-assembly-plugin加载不同环境所需的配置文件及使用场景

    背景: 如何加载不同环境的配置文件已经成了势在必行的,我们通常利用profile进行,详情参见我上篇博客 http://www.cnblogs.com/lianshan/p/7347890.html, ...

  4. spring boot由浅入深(一)jdk安装

    1jdk说明 jdk是java提供了运行环境,简单的说就是给java语言制定了规则,并且提供了工具 jdk官网网站:http://www.oracle.com/technetwork/java/jav ...

  5. 【Loadrunner】如何通过loadrunner利用代理对手机端Web浏览器及APP进行录制?

    以下为作者操作并最终可以成功录制脚本并调试成功的方法实际操作中记录截图,都是干货哦~ 1.安装lr11补丁 百度网盘下载链接:https://pan.baidu.com/s/1TPoaAMYvi1cw ...

  6. python 面向对象 字典 有序字典

    和原来字典一模一样 把dict 传进去 相当于这个类就是一个字典 # 把dict 传进去 相当于这个类就是一个字典 class Mydict(dict): pass d = Mydict() prin ...

  7. nodejs中Async详解之一:流程控制

    为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种 ...

  8. [.Net]System.OutOfMemoryException异常

    1. 一个异常情景 加载15000条等高线,平均每条线有400个点到三维球上,等待时间太长.而且可能会报内存异常. 2. 不错的分析 http://wenku.baidu.com/view/14471 ...

  9. python 实现的比特币代码 及 加密货币学习线路图及书籍资料

    http://www.pycoind.org/ https://github.com/samrushing/caesure https://bitcointalk.org/index.php?topi ...

  10. 常用linux shell脚本记录

    遍历目录下所有的文件是目录还是文件 for file in ./* do if test -f $file then echo $file 是文件 fi if test -d $file then e ...