注:原文作者coder-pig
原文请戳介里:http://blog.csdn.net/coder_pig/article/details/44784399
说到java的反射机制,小花是个小白,所以看这篇文章有点耗时有点累,对这个很陌生,不知大家看了有何感想。
另外附上小猪文中提到的《慕课网》视频地址:http://www.imooc.com/video/3725
本节引言:
其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的
视频教程觉得不错,又复习了一下,今天面试了一下午,回来就不想写代码了,就写写关于Java
反射的总结,写些简单的使用例子,最后找了2个Android中反射机制应用的例子,分别是
旧版本SDK利用AIDL + Java反射机制接听与挂断电话以及利用反射机制通过按钮关闭
对话框,后续如果用到会另外总结~
本节正文:
1.反射的相关概念图:
2.简单的使用示例:
我们写个简单的例子来理解Java反射机制的使用,其实就是通过Class类的相关方法实现而已!
我们先定义一个一个用来做演示的类:Test.java:
- package com.jay.test;
- public class Test {
- private String s1;
- public int i1;
- public static float PI = 3.14159f;
- public Test() {
- System.out.println("我是无参的构造方法");
- }
- public Test(String s1) {
- super();
- this.s1 = s1;
- System.out.println("我是有一个参数的构造方法");
- }
- public Test(String s1,int i1)
- {
- System.out.println("我是有两个参数的构造方法");
- }
- public void sum(int a,int b)
- {
- System.out.println("a+b = "+(a+b));
- }
- }
①获取某个类的相关信息:
- public static void getTheClass()
- {
- Class class1 = Test.class;
- System.out.println(class1.getName());
- System.out.println(class1.getSimpleName());
- }
运行截图:
②获取构造方法:
获取构造方法就要通过Constructor这个API了:
提供四种可供调用的方法:
Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,
Constructor[] getConstructors( ) -- 获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
Constructor[] getDeclaredConstructors( ) -- 获得类的所有构造函数(与接入级别无关)
代码示例:
- public static void getConstructor()
- {
- Class class1 = Test.class;
- Constructor[] cs = class1.getDeclaredConstructors();
- for(Constructor constructor:cs)
- {
- System.out.print(constructor.getName() + "(");
- //获取构造函数的参数列表的对应数据类型:
- Class[] ParamTypes = constructor.getParameterTypes();
- for(Class class2:ParamTypes)
- {
- System.out.print(class2.getSimpleName() + ",");
- }
- System.out.println(")");
- }
- }
运行截图:
③获取成员变量:
获取相关的成员变量则要用到Field这个API了:
也是提供了四种可供调用的方法:
Field getField(String name) -- 获得命名的公共字段
Field[] getFields( ) -- 获得类的所有公共字段
Field getDeclaredField(String name) -- 获得类声明的命名的字段
Field[] getDeclaredFields( ) -- 获得类声明的所有字段
代码示例:
- public static void getField()
- {
- Class class1 = Test.class;
- Field[] fields = class1.getFields();
- for(Field field:fields)
- {
- //得到成员变量的数据类型
- Class fieldType = field.getType();
- String TypeName = fieldType.getName();
- //获得成员变量的参数名称
- String filedName = field.getName();
- System.out.println(TypeName+" "+filedName);
- }
- }
运行截图:
④获得相关方法:
获取类中的相关方法就需要用到Method这个API了:
同样也是提供了四个可供调用的方法:
Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法
Method[] getMethods( ) -- 获得类的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法
Method[] getDeclaredMethods( ) -- 获得类声明的所有方法,不考略权限
代码示例:
①获得类中所有的公共方法:
- public static void getMethod()
- {
- Class class1 = Test.class;
- Method[] methods = class1.getMethods();
- for(int i = 0;i < methods.length;i++)
- {
- //获取方法返回值
- Class returnType = methods[i].getReturnType();
- System.out.print(returnType.getName() + " ");
- //获得方法名称
- System.out.print(methods[i].getName() + "(");
- //获取参数列表
- Class[] paramTypes = methods[i].getParameterTypes();
- for(Class class2:paramTypes)
- {
- System.out.print(class2.getName() + ",");
- }
- System.out.println(")");
- }
- }
运行截图:
除了我们自定义的方法外,我们还看到了一些其他的方法,他们是父类提供的一些方法~
②利用反射调用相关方法:
代码示例:
- public static void useMethod()throws Exception
- {
- Test test = new Test();
- Class class1 = test.getClass();
- Method method = class1.getMethod("sum", int.class,int.class);
- Object object = method.invoke(test, new Object[]{11,22});
- }
运行截图:
当然调用该方法的时候别忘了捕获异常哦!
3.Android中使用反射实例:
关于在Android中的反射机制的一些实例,比如:Android 在1.1版本后就把接听与挂断的API给隐藏
了,我们就可以通过AIDL + 反射机制来调用ITelephony中的相关方法,鉴于篇幅,时间关系这里就
不详细演示讲解,关于Android中反射机制的例子可参考下述资料:
①Android接听与挂断电话的实现:
http://blog.sina.com.cn/s/blog_5da93c8f0101g4wb.html
②利用反射机制通过按钮关闭对话框:
http://blog.csdn.net/nokiaguy/article/details/5770263
ps:另外,貌似Android 4.1后上述接听电话的方法就不可以了,高版本的解决方法如下:
http://bbs.51cto.com/thread-1078059-1.html
好了,关于Java反射浅析就暂时了解到这里吧,后续遇到相关的再mark~
-
顶
- 1