【Java 进阶】Java 反射
来源:互联网 发布:农村淘宝咨询电话 编辑:程序博客网 时间:2024/06/04 17:50
反射:获取Class中所有字段(Field)与方法(Method),并实现调用(invoke)
Java 反射简单使用(获取Person类中Field与Method):
Person 类:
package com.jerry.reflect;public class Person { private String mName = "LiuDongBing"; private int mAge = 28; protected String getName() { LogUtils.d("getName :"); return mName; } private void setName(String name) { LogUtils.d("setName :" + name); mName = name; } private int getAge() { return mAge; } public void setAge(int age) { mAge = age; }}
反射方案:
//获取Person类Class mPersonClass = Class.forName("com.jerry.reflec.Person");//获取Person实例Object mPersonObject = mPersonClass.newInstance();//获取字段(Field)Field mPersonField = mPersonClass.getDeclaredField("mNAme");String mName = mPersonField.getName();//获取方法(Method)Method mPersonMethod01 = mPersonClass.getDeclaredMethod("getName");//获取无参数方法Method mPersonMethod02 = mPersonClass.getDeclaredMethod("setName",String.class);//获取String参数的方法//调用方法String Name = mPersonMethod01.invoke(mPersonObject);//无参数mPersonMethod02.invoke(mPersonObject,“JerryLiu”);//调用有参数方法,“JeryyLiu”即为传递参数
注意:
获取字段与方法有多种方案,仅以获取方法讲解,(字段Field类似)
//获取方法4种实现方案(只需使用一种):Field mPersonMethod01 = personClass.getMethod("getNme");Field mPersonMethod02 = personClass.getDeclaredMethod("setName",String.class);//获取Person子类,父类,与其自己所有的public 属性的方法 Field[] mPersonMethod03 = personClass.getMethods();//获取Person类中所有字段Field[] mPersonMethod04 = personClass.getDeclaredMethods();//打印所有字段for (int i = 0; i < mPersonField.length ; i++) { LogUtils.d("Field ["+i+"]="+mPersonField[i].getName());}
Android 系统 Jar 包方法与字段使用@Hide注解,正常方案不能使用,附属使用android.jar 中@Hide属性获取代码:
public static String getSystemProperties(String key) { Class<?> mSystemProperties; try { mSystemProperties = Class.forName("android.os.SystemProperties"); Method method = mSystemProperties.getDeclaredMethod("get", String.class); return (String) method.invoke(mSystemProperties.newInstance(), key); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } return ""; }
参考文章
Android中反射的简单应用
阅读全文
0 0
- 【Java 进阶】Java 反射
- Java进阶 反射
- java之反射进阶
- Java进阶之反射
- Java进阶之反射
- JAVA反射进阶篇
- 【Java进阶】-Java反射机制
- JAVA进阶学习-反射机制
- Java 反射由浅入深 | 进阶必备
- 进阶:Java Reflection (JAVA反射)详解
- java进阶之java的反射机制
- 【Java进阶】Java反射的使用
- 【Java进阶】Java反射机制初识
- JAVA进阶4.13——反射机制
- Java进阶之reflection(反射机制)
- Java基础进阶——“Java反射之一”
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
- scikit-learn 回归基础 分类:机器学习Sklearn
- 简单错误记录(通过70%)
- java软件工程师面试的内容
- 如何汇报工作与计划
- 从零基础学习Java 要知道Java中的一些规则
- 【Java 进阶】Java 反射
- 96. Unique Binary Search Trees
- 字典树初级
- 淘宝开源库VLayout实践
- Eclipse下内存溢出错误(OutOfMemoryError)
- 【BZOJ4103】异或运算(THUSC2015)-可持久化trie树+位运算
- 专访DeepID发明者孙祎:关于深度学习与人脸算法的深层思考
- 近似因子模型 分类:机器学习
- FPGA学习(第5节)-看电路图写出Verilog代码(乘法运算+自加一+模块实例化等)