JavaReflectionAPI简介

Java Reflection API提供对JVM中的类,接口和对象的深入洞察。开发者通常使用API来完成以下的任务,这解释了为什么总是使用开发工具,例如debugger和Integrated Development Environments (IDEs):

· 决定一个对象的类。

· 获得关于一个类的modifiers, fields, methods, construcTors, etc的信息。

· 获得关于一个接口的常量和方法声明。

· 创建一个类的instance,这个类的名字直到运行时才知道,而且在设计时间时可用或是作为一个运行参数被提供。

· 获得并设置一个对象的field值,即使field的名字直到运行时程序才会知道。

· 调用一个对象上的方法,即使这个方法直到运行时才会知道。

Reflection的具体使用是在JavaBeans中,这里你可以通过一个构建工具来操作软件组件。工具使用reflection来获取Java 组件(类)的属性,因为它们是动态加载。

使用Reflection检索Class Behavior

为了了解你如何使用Reflection来确定一个类行为,考虑以下Employee class的简单例子:

 public class Employee   {  public String empNum;  public String empName;  public Employee()  {  this( "1", "King");  }  public Employee(String empNum, String empName)  {  empNum = empNum;  empName = empName;  }  public String toString()  {  return "Employee Details: EmpNumber: " + empNum + ",  EmpName: "+ empNum;  }  }  import java.lang.reflect.Modifier;  public class AnalyzeClass  {  public static void main(String[] args)  {  Employee employee = new Employee();  Class klass = employee.getClass();  System.out.println( "Class name: " + klass.getName());  System.out.println(  "Class super class: " + klass.getSuperclass());  int mods = klass.getModifiers();  System.out.println(  "Class is public: " + Modifier.isPublic(mods));  System.out.println(  "Class is final: " + Modifier.isFinal(mods));  System.out.println(  "Class is abstract: " + Modifier.isAbstract(mods));  }  }

编译Modifier classes并执行AnalyzeClass产生如下结果:

  Class name: Employee   Class super class: class java.lang.Object  Class is public: true  Class is final: false  Class is abstract: false

这个基本上是Employee class的一个引用,所以可以检索它的所有属性。还需要更有说服力的吗?看另外一个关于Method class的例子:

 import java.lang.reflect.*;   public class DumpMethods {  public static void main(String args[])  {  try {  Class c = Class.forName(args[0]);  Method m[] = c.getDeclaredMethods();  for (int i = 0; i < m.length; i++)  System.out.println(m[i].toString());  }  catch (Throwable e) {  System.err.println(e);  }  }  }

但你编译这个代码的时候,用带有已知类的一个argument来调用它…

  java DumpMethods java.util.Stack

…你得到以下的结果:

  public synchronized java.lang.Object java.util.Stack.pop()   public java.lang.Object java.util.Stack.push(java.lang.Object)  public boolean java.util.Stack.empty()  public synchronized java.lang.Object java.util.Stack.peek()  public synchronized int java.util.Stack.search(java.lang.Object)

在上面的结果中列出了所有java.util.Stack class的方法。Method 是在java.lang.reflect中的一个类,负责产生这个结果。

使用Reflection检索Attributes

一个类有其他的一些实体,除了迄今为止你看到的那些。变量怎么样,举个例子?你可以使用reflection来获取这些实体的具体输出。这里是使用一个Field class的另一个例子:

 import java.lang.reflect.*;   public class DumpFields {  public static void main(String args[])  {  try {  Class c = Class.forName(args[0]);  Field[] fields = c.getFields();  for (int i = 0; i < fields.length; i++)  System.out.println(fields[i].toString());  }  catch (Throwable e) {  System.err.println(e);  }  }  }

当你编译这个代码的时候并用Employee的一个argument执行它…

  java DumpFields Employee

你得到以下的结果:

         public java.lang.String Employee.empNum   public java.lang.String Employee.empName

这个结果列出所有属于该类的fields和ttributes。

使用Reflection检索ConstrucTors

这个ConstrucTor类的例子将帮助完成对各种construcTors运用的理解,以及如何使用它们。

      import java.lang.reflect.*;   public class DumpConstrucTors {  public static void main(String args[])  {  try {  Class c = Class.forName(args[0]);  ConstrucTor[] construcTor = c.getConstrucTors();  for (int i = 0; i < construcTor.length; i++)  {  System.out.println(construcTor[i].toString());  //To print the parameter types  Class pvec[] = construcTor[i].getParameterTypes();  for (int j = 0; j < pvec.length; j++)  System.out.println("param #" + j + " "  + pvec[j]);  }  }  catch (Throwable e) {  System.err.println(e);  }  }  }

当你编译这个代码的时候并用Employee的一个argument执行它…

  javac DumpConstrucTors Employee

…你得到以下的结果:

         public Employee(java.lang.String,java.lang.String)   param #0 class java.lang.String  param #1 class java.lang.String  public Employee()

分析结果的时候你会发现Employee类有两个construcTor。第一个是带参数的construcTor(你也可以看到参数类型)。第二个没有采用任何参数,结果是不言而喻的。

使用Reflection在运行时执行Class Methods

假设你有一个类并想要在运行的时候使用它。下列代码显示你如何加载这个类并在运行时执行一个所期望的方法。这里假设的是那个方法的名字是setProperties而且采用java.util.Properties类型的一个argument。

  Class newClass = null;   Method getInstanceMethod = null;  Properties prop = new Properties();  prop.put("argName", "argValue");  try  {  Object bj = newClass.newInstance();  getInstanceMethod = newClass.getMethod("setProperties",  new Class[]{new Properties().getClass()});  }  catch (Exception ex)  {  //Exception in loading Class:" + ex.getMessage();  }

这些工具让一个IDE开发者很容易适应Java作为一个支持编程的语言。

自己要先看得起自己,别人才会看得起你

JavaReflectionAPI简介

相关文章:

你感兴趣的文章:

标签云: