作家
登录

Java反射机制剖析:定义和API

作者: 来源: 2012-06-12 17:00:50 阅读 我要评论

1. 什么是Java反射机制

Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法。这种运行时的动态获取就是Java的反射机制。其实这也是Java是动态语言的一个象征。

用一句话来概括反射就是加载一个运行时才知道的类以及它的完整内部结构。

2. 为什么要有Java反射机制

我们为什么要用Java的反射机制呢?

我认为有两种:

第一种:反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。

第二种:在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码new ClassName(),而必须用到反射才能创建这个对象。

一个生活中常看到的例子有助于理解我们为什么要用Java的反射机制:你进了一家饭店,你不知道他们都有那些菜,要多少钱。那么你第一件事情是干啥“服务员拿个菜单过来”,然后指着菜单说“我要这个,我要那个”。

3. 一起来看ReflectionAPI

在生活中,我们使用一个未知的东西的时候总会用帮助来解决我们的使用问题,电视机有帮助,电脑有帮助,几乎所有的事物都携带着它的一本帮助,Java的反射机制也不例外。

在JDK中有Reflection API的帮助,它主要说明了什么是Java反射机制,这种反射机制提供了什么样的属性和方法,进一步我们能够知道能够通过它完成什么样的工作。

下面咱就一起看看这部分的API。这些接口和类都位于lang包里。

如图:

接口:

类:

简单介绍一些类和接口的用法:

1) Member成员是一种接口,反映有关单个成员(字段或方法)或构造方法的标识信息

2) InvocationHandler是代理实例的调用处理程序 实现的接口(这个接口的具体用法等到java反射机制剖析4着重介绍)

3) Method提供一个类的方法的信息以及访问类的方法的接口。

示例:

  1. import java.lang.reflect.Method;  
  2.  
  3. public class TestMethod {  
  4.  
  5.     /**  
  6.      * @param args  
  7.      * @throws Exception   
  8.      */ 
  9.     public static void main(String[] args) throws Exception {  
  10.         // TODO Auto-generated method stub  
  11.         Class classType=Class.forName(args[0]);  
  12.         Method methods[]=classType.getDeclaredMethods();  
  13.         for(int i=0;i<methods.length;i++){  
  14.             System.out.println(methods[i].toString());  
  15.         }  
  16.     }  
  17.  

4) Filed提供一个类的域的信息以及访问类的域的接口。

示例:

  1. import java.lang.reflect.Field;  
  2.  
  3.  
  4. public class TestField {  
  5.  
  6.     /**  
  7.      * @param args  
  8.      * @throws Exception   
  9.      */ 
  10.     public static void main(String[] args) throws Exception {  
  11.         // TODO Auto-generated method stub  
  12.         Class classType=Class.forName(args[0]);  
  13.         Field[] fields = classType.getFields();  
  14.         for(int i=0;i<fields.length;i++){  
  15.         System.out.println(fields[i].toString());  
  16.         }  
  17.     }  
  18.  

5) Array 类提供了动态创建和访问 Java 数组的方法。

示例:

  1. import java.lang.reflect.Array;  
  2.  
  3.  
  4. public class TestArray {  
  5.  
  6.     public TestArray(){  
  7.           
  8.     }  
  9.     /**  
  10.      * @param args  
  11.      * @throws Exception   
  12.      */ 
  13.     public static void main(String[] args) throws Exception {  
  14.           
  15.         Class<?> classType = Class.forName("java.lang.String");  
  16.           
  17.         Object array = Array.newInstance(classType, 10);  
  18.           
  19.         Array.set(array, 5"hello");  
  20.           
  21.         String s = (String)Array.get(array, 5);  
  22.         System.out.println(s);  
  23.           
  24.     }  
  25.  

6) Proxy提供动态地生成代理类和类实例的静态方法(这个方法在java放射机制剖析4着重介绍)。

其余的类和接口的使用方法详见API

原文链接:http://blog.csdn.net/lfsf802/article/details/7239652

【编辑推荐】

  1. Java远程方法调用RMI
  2. Java处理字符串搜索嵌套结构的方法
  3. Java编程:常见问题汇总
  4. Java迷题:等于,还是不等于?
  5. Java数据库连接代码集合

  推荐阅读

  Java远程方法调用RMI

前段时间,公司做web service的时候,看了一下资料,当时看见一个叫rmi的东西(远程方法调用),最近闲着,所以看了一下 ,感觉挺简单的!所以写了一个例子提供给大家把!rmi的服务端,必须要使用接口,同时还有接口的>>>详细阅读


本文标题:Java反射机制剖析:定义和API

地址:http://www.17bianji.com/kaifa2/Java/1063.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)