RTTI 语法

本文探讨了Java中实现运行时类型识别(RTTI)机制的多种方式,重点介绍了Class对象的功能及其提供的方法,如getInterfaces(), getSuperclass()和newInstance()等。通过示例代码展示了如何使用这些方法获取类的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 是通过 Class 对象来实现 RTTI 机制的,即使我们只是要做些诸如类型转换这类的事
情。Class 类也提供了许多其他途径,以方便我们使用 RTTI。
首 先 , 你 需 要 获 得 指 向 适 当 的 Class 对 象 的 引 用 。 一 种 办 法 是 用 字 符 串 以 及
Class.forName()方法,就象前例演示的那样。这种做法很方便,因为你在获取 Class
的引用事,并不需要生成该 Class 类型的对象。然而,如果你已经有了一个你感兴趣的类
型的对象,那么你就可以通过调用 getClass()来获取 Class 的引用,这是根类 Object
提供的方法。它返回 Class 的引用,用来表示对象的实际类型。Class 提供了一些有趣的
方法,下面的例子为你展示这些方法:
//: c10:ToyTest.java
// Testing class Class.
import com.bruceeckel.simpletest.*;
interface HasBatteries {}
interface Waterproof {}
interface Shoots {}
class Toy {
  // Comment out the following default constructor
  // to see NoSuchMethodError from (*1*)
  Toy() {} 
  Toy(int i) {}
}
class FancyToy extends Toy
implements HasBatteries, Waterproof, Shoots {
  FancyToy() { super(1); }
}
public class ToyTest {
private static Test monitor = new Test();
static void printInfo(Class cc) {
    System.out.println("Class name: " + cc.getName() +
" is interface? [" + cc.isInterface() + "]");
  } 
public static void main(String[] args) {
    Class c = null;
try {
      c = Class.forName("FancyToy");
    } catch(ClassNotFoundException e) {
      System.out.println("Can't find FancyToy");
      System.exit(1);
    } 
    printInfo(c);
    Class[] faces = c.getInterfaces();
for(int i = 0; i < faces.length; i++)
      printInfo(faces[i]);
    Class cy = c.getSuperclass();
    Object  o = null;
try {
      // Requires default constructor:
      o = cy.newInstance(); // (*1*)
    } catch(InstantiationException e) {
      System.out.println("Cannot instantiate");
      System.exit(1);
    } catch(IllegalAccessException e) {
      System.out.println("Cannot access");
      System.exit(1);
    } 
    printInfo(o.getClass());
    monitor.expect(new String[] {
"Class name: FancyToy is interface? [false]",
"Class name: HasBatteries is interface? [true]",
"Class name: Waterproof is interface? [true]",
"Class name: Shoots is interface? [true]",
"Class name: Toy is interface? [false]"
    });
  } 
} ///:~
从中可以看出,FancyToy 类相当复杂,因为它不但继承了 Toy 类,而且还实现了
HasBatteries,Waterproof 以及 Shoots 接口。在 main()方法中,通过在适当的 try
语句块中使用 forName(),创建并初始化了一个指向 FancyToy Class 的引用。


Class.getInterfaces()方法返回 Class 对象的数组,这些对象代表的是某个 Class
对象所包含的接口。


如果你有一个 Class 对象,那么你就可以通过 getSuperclass()获取它的直接基类。这
个方法自然也是返回一个 Class 的引用,所以你可以进一步查询其基类。这意味着在运行
期,你可以找到一个对象完整的类层次结构。


乍看起来,Class 的 newInstance()方法似乎只是另一种克隆 clone()对象的方法。然
而,即使原先没有任何对象存在,你也可以用 newInstance()创建一个新的对象,就像在
上例中并没有任何 Toy 对象,只有 y 的 Class 对象的引用 cy。这是一种实现“虚拟构造
器(virtual constructor)”的途径,这使得你可以说:“尽管我不知道你的准确类型
是什么,但无论怎样,还是请正确地创建你自己。”在上面的例子中,cy 只是一个 Class
的引用,在编译期并不知道更多的类型信息。当你创建一个新实例时,你将得到一个 Object
引用,但这个引用实际指向的是一个 Toy 对象。所以如果向 Object 发送它不能接收的消
息,你必须先对其进行深入了解,进行类型转换。以外,使用 newInstance()的类必须要
有一个缺省构造器。在下一节,通过使用 Java 反射 API(Java reflecion API),你
会看到如何使用任意的构造器来动态地创建对象。


最后一个要介绍的方法是 printInfo(),它以一个 Class 引用为参数,通过 getName()
获取其名字,并通过 isInterface()查看它是否是一个接口。因此,通过使用 Class 对

象,我们可以找出一个对象的任何信息。



资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值