快速业务通道

Java Reflection API简介 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

Java Reflection API简介

时间:2011-11-02

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));
  }
  }

Java Reflection API简介(2)

时间:2011-11-02

编译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)
  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号