Java反射机制浅析图+应用实例

转载自:http://blog.csdn.net/coder_pig/article/details/44784399


Java反射机制浅析图+应用实例

——转载请注明出处:coder-pig


本节引言:


其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的

视频教程觉得不错,又复习了一下,今天面试了一下午,回来就不想写代码了,就写写关于Java

反射的总结,写些简单的使用例子,最后找了2个Android中反射机制应用的例子,分别是

旧版本SDK利用AIDL + Java反射机制接听与挂断电话以及利用反射机制通过按钮关闭

对话框,后续如果用到会另外总结~




本节正文:

1.反射的相关概念图:




2.简单的使用示例:

我们写个简单的例子来理解Java反射机制的使用,其实就是通过Class类的相关方法实现而已!

我们先定义一个一个用来做演示的类:Test.java:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.jay.test;  
  2.   
  3. public class Test {  
  4.   
  5.     private String s1;  
  6.     public int i1;  
  7.     public static float PI = 3.14159f;  
  8.       
  9.       
  10.     public Test() {  
  11.         System.out.println("我是无参的构造方法");  
  12.     }  
  13.       
  14.       
  15.     public Test(String s1) {  
  16.         super();  
  17.         this.s1 = s1;  
  18.         System.out.println("我是有一个参数的构造方法");  
  19.     }  
  20.       
  21.       
  22.     public Test(String s1,int i1)  
  23.     {  
  24.         System.out.println("我是有两个参数的构造方法");  
  25.     }  
  26.       
  27.   
  28.     public void sum(int a,int b)  
  29.     {  
  30.         System.out.println("a+b = "+(a+b));  
  31.     }  
  32.       
  33. }  




①获取某个类的相关信息:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void getTheClass()  
  2. {  
  3.     Class class1 = Test.class;  
  4.     System.out.println(class1.getName());  
  5.     System.out.println(class1.getSimpleName());  
  6. }  

运行截图:



②获取构造方法:

获取构造方法就要通过Constructor这个API了:

提供四种可供调用的方法:

Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数, 

Constructor[] getConstructors( ) -- 获得类的所有公共构造函数 

Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关) 

Constructor[] getDeclaredConstructors( ) -- 获得类的所有构造函数(与接入级别无关) 


代码示例:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void getConstructor()  
  2. {  
  3.     Class class1 = Test.class;  
  4.     Constructor[] cs = class1.getDeclaredConstructors();  
  5.     for(Constructor constructor:cs)  
  6.     {  
  7.         System.out.print(constructor.getName() + "(");  
  8.         //获取构造函数的参数列表的对应数据类型:  
  9.         Class[] ParamTypes = constructor.getParameterTypes();  
  10.         for(Class class2:ParamTypes)  
  11.         {  
  12.             System.out.print(class2.getSimpleName() + ",");  
  13.         }  
  14.         System.out.println(")");  
  15.     }  
  16. }  

运行截图:





③获取成员变量:

获取相关的成员变量则要用到Field这个API了:

也是提供了四种可供调用的方法:

Field getField(String name) -- 获得命名的公共字段 

Field[] getFields( ) -- 获得类的所有公共字段 

Field getDeclaredField(String name) -- 获得类声明的命名的字段 

Field[] getDeclaredFields( ) -- 获得类声明的所有字段 


代码示例:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void getField()  
  2. {  
  3.     Class class1 = Test.class;  
  4.     Field[] fields = class1.getFields();  
  5.     for(Field field:fields)  
  6.     {  
  7.         //得到成员变量的数据类型  
  8.         Class fieldType = field.getType();  
  9.         String TypeName = fieldType.getName();  
  10.         //获得成员变量的参数名称  
  11.         String filedName = field.getName();  
  12.         System.out.println(TypeName+" "+filedName);  
  13.     }  
  14. }  


运行截图:








④获得相关方法:

获取类中的相关方法就需要用到Method这个API了:

同样也是提供了四个可供调用的方法:

Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法 

Method[] getMethods( ) -- 获得类的所有公共方法 

Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法 

Method[] getDeclaredMethods( ) -- 获得类声明的所有方法,不考略权限 



代码示例:

①获得类中所有的公共方法:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void getMethod()  
  2. {  
  3.     Class class1 = Test.class;  
  4.     Method[] methods = class1.getMethods();  
  5.     for(int i = 0;i < methods.length;i++)  
  6.     {  
  7.         //获取方法返回值  
  8.         Class returnType = methods[i].getReturnType();  
  9.         System.out.print(returnType.getName() + " ");  
  10.         //获得方法名称  
  11.         System.out.print(methods[i].getName() + "(");  
  12.         //获取参数列表  
  13.         Class[] paramTypes = methods[i].getParameterTypes();  
  14.         for(Class class2:paramTypes)  
  15.         {  
  16.             System.out.print(class2.getName() + ",");  
  17.         }  
  18.         System.out.println(")");  
  19.     }  
  20. }  

运行截图:


除了我们自定义的方法外,我们还看到了一些其他的方法,他们是父类提供的一些方法~


②利用反射调用相关方法:

代码示例:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void useMethod()throws Exception  
  2. {  
  3.     Test test = new Test();  
  4.     Class class1 = test.getClass();  
  5.     Method method = class1.getMethod("sum"int.class,int.class);  
  6.     Object object = method.invoke(test, new Object[]{11,22});  
  7. }     

运行截图:


当然调用该方法的时候别忘了捕获异常哦!






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~大笑


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值