Java反射机制

   转自eoehttp://www.eoeandroid.com/forum.php?mod=viewthread&tid=79155

Java反射机制是Java语言被视为准动态语言的关键性质。Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域。

      也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制。你会嗤之以鼻地告诉我,Java反射机制没啥用。或许在J2EE、J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在 android应用开发 中,该机制会带给你许多惊喜。
      如果熟悉Android,那么你应该知道,Google不知出于什么原因,在系统源码中一些类或方法中经常加上注释标记。它的作用是使这个方 法或类在生成SDK时不可见,因此由此注释的东西,你在编译期是不可见的。这就出现了一些问题。一些明明可以访问的东西编译期却无法访问了!这使得你的程序有些本来可以完成的功能无法编译通过。
       当然,有一种办法是自己去掉Android源码中的所有标记,然后重新编译一份自己的SDK。另一种办法就是使用Java反射机制。当然,你还可以利用反射来访问存在访问限制的方法和修改其域。不过这种使用方法比较特殊,我们在文章的最后单独讨论。
       从Class类说起如果你使用Java,那么你应该知道Java中有一个Class类。Class类本身表示Java对象的类型,我们可以通过一个Object(子)对象的 getClass方法取得一个对象的类型,此函数返回的就是一个Class类。当然,获得Class对象的方法有许多,但是没有一种方法是通过Class 的构造函数来生成Class对象的。

       也许你从来没有使用过Class类,也许你曾以为这是一个没什么用处的东西。不管你以前怎么认为,Class类是整个Java反射机制的源头。一切关于Java反射的故事,都从Class类开始。

       因此,要想使用Java反射,我们首先得到Class类的对象。下表列出了几种得到Class类的方法,以供大家参考。

Class object  诞生管道

  
   
示例

  
   
运用getClass()

   
注:每个class 都有此函数

  
   
String str = "abc";

   
Class c1 = str.getClass();

  
   
运用

   
Class.getSuperclass()

  
   
Button b = new Button();

   
Class c1 = b.getClass();

   
Class c2 = c1.getSuperclass();

  
   
运用static method

   
Class.forName()

   
(最常被使用)

  
   
Class c1 = Class.forName ("java.lang.String");

   
Class c2 = Class.forName ("java.awt.Button");

   
Class c3 = Class.forName ("java.util.LinkedList$Entry");

   
Class c4 = Class.forName ("I");

   
Class c5 = Class.forName ("[I");

  
   
运用

   
.class  语法

  
   
Class c1 = String.class;

   
Class c2 = java.awt.Button.class;

   
Class c3 = Main.InnerClass.class;

   
Class c4 = int.class;

   
Class c5 = int[].class;

  
   
运用

   
primitive wrapper classes

   
的TYPE 语法

  
   
Class c1 = Boolean.TYPE;

   
Class c2 = Byte.TYPE;

   
Class c3 = Character.TYPE;

   
Class c4 = Short.TYPE;

   
Class c5 = Integer.TYPE;

   
Class c6 = Long.TYPE;

   
Class c7 = Float.TYPE;

   
Class c8 = Double.TYPE;

   
Class c9 = Void.TYPE;  

获取一些基本信息

在我们得到一个类的Class类对象之后,Java反射机制就可以大施拳脚了。首先让我们来了解下如何获取关于某一个类的一些基本信息。

   
Java class  内部模块

  
   
Java class  内部模块说明

  
   
相应之Reflection API,多半为Class methods。

  
   
返回值类型(return type)

  
   
package

  
   
class 隶属哪个package

  
   
getPackage()

  
   
Package

  
   
import

  
   
class 导入哪些classes

  
   
无直接对应之API。可间接获取。

  

   
modifier

  
   
class (或methods, fields)的属性

  
   
int getModifiers()

   
Modifier.toString(int)

   
Modifier.isInterface(int)

  
   
int

   
String

   
bool

  
   
class name or interface name

  
   
class/interface

  
   
名称getName()

  
   
String

  
   
type parameters

  
   
参数化类型的名称

  
   
getTypeParameters()

  
   
TypeVariable <Class>[]

  
   
base class

  
   
base class (只可能一个)

  
   
getSuperClass()

  
   
Class

  
   
implemented interfaces

  
   
实现有哪些interfaces

  
   
getInterfaces()

  
   
Class[]

  
   
inner classes

  
   
内部classes

  
   
getDeclaredClasses()

  
   
Class[]

  
   
outer class

  
   
如果我们观察的class 本身是inner classes,那么相对它就会有个outer class。

  
   
getDeclaringClass()

  
   
Class  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值