首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>java企业应用>正文

进阶:Java Reflection (JAVA反射)详解

http://www.oklinux.cn  2008-03-07  来源: ccidnet 执木  会员收藏  游客收藏  【 】 

Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。

  Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C 中就没有办法在程序中获得函数定义相关的信息。

  JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。

  1. 一个简单的例子

  考虑下面这个简单的例子,让我们看看 reflection 是如何工作的。

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 {
System.err.println(e);
}
}
}

  按如下语句执行:

  java DumpMethods java.util.Stack

  它的结果输出为:

public java.lang.Object java.util.Stack.push(java.lang.Object)

public synchronized java.lang.Object java.util.Stack.pop()

public synchronized java.lang.Object java.util.Stack.peek()

public boolean java.util.Stack.empty()

public synchronized int java.util.Stack.search(java.lang.Object)

  这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。

  这个程序使用 Class.forName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。

  2.开始使用 Reflection

  用于 reflection 的类,如 Method,可以在 java.lang.relfect 包中找到。使用这些类的时候必须要遵循三个步骤:第一步是获得你想操作的类的 java.lang.Class 对象。在运行中的 Java 程序中,用 java.lang.Class 类来描述类和接口等。

  下面就是获得一个 Class 对象的方法之一:

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

  这条语句得到一个 String 类的类对象。还有另一种方法,如下面的语句:

  Class c = int.class;

  或者

  Class c = Integer.TYPE;

  它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。

  第二步是调用诸如 getDeclaredMethods 的方法,以取得该类中定义的所有方法的列表。

一旦取得这个信息,就可以进行第三步了——使用 reflection API 来操作这些信息,如下面这段代码:

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

  Method m[] = c.getDeclaredMethods();

  System.out.println(m[0].toString());

  它将以文本方式打印出 String 中定义的第一个方法的原型。

  在下面的例子中,这三个步骤将为使用 reflection 处理特殊应用程序提供例证。

  模拟 instanceof 操作符

  得到类信息之后,通常下一个步骤就是解决关于 Class 对象的一些基本的问题。例如,Class.isInstance 方法可以用于模拟 instanceof 操作符:

class A {
}

public class instance1 {
public static void main(String args[]) {
try {
Class cls = Class.forName("A");
boolean b1 = cls.isInstance(new Integer(37));
System.out.println(b1);
boolean b2 = cls.isInstance(new A());
System.out.println(b2);
} catch {
System.err.println(e);
}
}
}

  在这个例子中创建了一个 A 类的 Class 对象,然后检查一些对象是否是 A 的实例。Integer(37) 不是,但 new A()是。

  3.找出类的方法

  找出一个类中定义了些什么方法,这是一个非常有价值也非常基础的 reflection 用法。下面的代码就实现了这一用法:

import java.lang.reflect.*;

public class method1 {
private int f1(Object p, int x) throws NullPointerException {
if (p == null)
throw new NullPointerException();
return x;
}

public static void main(String args[]) {
try {
Class cls = Class.forName("method1");
Method methlist[] = cls.getDeclaredMethods();
for (int i = 0; i < methlist.length; i ) {
Method m = methlist[i];
System.out.println("name = " m.getName());
System.out.println("decl class = " m.getDeclaringClass());
Class pvec[] = m.getParameterTypes();
for (int j = 0; j < pvec.length; j )
System.out.println("param #" j " " pvec[j]);
Class evec[] = m.getExceptionTypes();
for (int j = 0; j < evec.length; j )
System.out.println("exc #" j " " evec[j]);
System.out.println("return type = " m.getReturnType());
System.out.println("-----");
}

共4页: 上一页 1 [2] [3] [4] 下一页

上一篇:以全局的固定顺序获取多个锁来避免死锁   下一篇:JBuilder7 Weblogic7 mysql开发EJB配置


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·JBuilder7 Weblogic7 mysql开发EJB配置
·以全局的固定顺序获取多个锁来避免死锁
·在Web项目中用到JNI时应该注意的问题
·JAVA高级:Java中限时线程回调方式的实现
·超线程多核心下Java多线程编程彻底分析
·表现层框架Struts/Tapestry/JSF比较
·开发JAVA编程中字符串分割的两种方法
·Java SE6调用Java编译器的两种新方法
·Java理论和实践:用软引用阻止内存泄漏
·JAVA入门基础:区分引用类型和原始类型
·学习心得 - JSP处理异常及一些高级主题
·Java程序开发过程中异常处理的特殊情况
·架构与模式:多线程有几种常用的编程模型
·建立JSP操作用以提高数据库访问的效率
·使用JAVA中的动态代理实现数据库连接池
·Weblogic下使用jsp查询的Entity Bean
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java SE6调用Java编译器的两种新方法
·表现层框架Struts/Tapestry/JSF比较
·在Web项目中用到JNI时应该注意的问题
·JBuilder7 Weblogic7 mysql开发EJB配置
·以全局的固定顺序获取多个锁来避免死锁
·JAVA高级:Java中限时线程回调方式的实
·超线程多核心下Java多线程编程彻底分析
·开发JAVA编程中字符串分割的两种方法
·Java理论和实践:用软引用阻止内存泄漏
·JAVA入门基础:区分引用类型和原始类型
·学习心得 - JSP处理异常及一些高级主题
·Java程序开发过程中异常处理的特殊情况
  阅读排行
·Commons-logging Log4j 的入门指南
·服务器及中间件:TomCat 多虚拟站点配置
·开发框架:一篇关于SSH架构的简单总结
·jboss4.0下使用MySql数据源的设置方法
·Java SE6调用Java编译器的两种新方法
·Java语言:敏捷开发技巧-消除代码异味
·数据库相关:Log4j和JDBMonitor的比较
·使用JAVA中的动态代理实现数据库连接池
·架构与模式:多线程有几种常用的编程模
·开发框架-Struts里过滤器的简单使用
·表现层框架Struts/Tapestry/JSF比较
·在Web项目中用到JNI时应该注意的问题
·Java 安全:Java 语言的 XML 验证 API
·Hibernate源码中几个包的作用简要介绍
·Java GUI:在Java中监控文本框的变化
网摘收藏: