候捷谈Java反射机制(3)

本文通过具体示例展示了如何使用Java Reflection API来获取类的各种信息,包括包名、字段、构造函数、方法等,并介绍了如何利用这些信息进行进一步的程序操作。

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

Java Reflection API 运用示例<o:p></o:p>

5示范图4提过的每一个Reflection API,及其执行结果。程序中出现的tName()是个辅助函数,可将其第一自变量所代表的“Java class完整路径字符串”剥除路径部分,留下class名称,储存到第二自变量所代表的一个hashtable去并返回(如果第二自变量为null,就不储存而只是返回)。<o:p></o:p>

<o:p> </o:p>

#001 Class c = null;<o:p></o:p>

#<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="2" unitname="C">002 c</st1:chmetcnv> = Class.forName(args[0]);<o:p></o:p>

#003<o:p></o:p>

#004 Package p;<o:p></o:p>

#005 p = c.getPackage();<o:p></o:p>

#006<o:p></o:p>

#007 if (p != null)<o:p></o:p>

#008    System.out.println("package "+p.getName()+";");<o:p></o:p>

<o:p> </o:p>

执行结果(例):<o:p></o:p>

package java.util;<o:p></o:p>

5-1:找出class 隶属的package。其中的c将继续沿用于以下各程序片段。<o:p></o:p>

<o:p> </o:p>

#001 ff = c.getDeclaredFields();<o:p></o:p>

#002 for (int i = 0; i < ff.length; i++)<o:p></o:p>

#003    x = tName(ff[i].getType().getName(), classRef);<o:p></o:p>

#004<o:p></o:p>

#005 cn = c.getDeclaredConstructors();<o:p></o:p>

#006 for (int i = 0; i < cn.length; i++) {<o:p></o:p>

#007    Class cx[] = cn[i].getParameterTypes();<o:p></o:p>

#008    for (int j = 0; j < cx.length; j++)<o:p></o:p>

#009        x = tName(cx[j].getName(), classRef);<o:p></o:p>

#010 }<o:p></o:p>

#011<o:p></o:p>

#<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="12" unitname="mm">012 mm</st1:chmetcnv> = c.getDeclaredMethods();<o:p></o:p>

#013 for (int i = 0; i < mm.length; i++) {<o:p></o:p>

#014    x = tName(mm[i].getReturnType().getName(), classRef);<o:p></o:p>

#015    Class cx[] = mm[i].getParameterTypes();<o:p></o:p>

#016    for (int j = 0; j < cx.length; j++)<o:p></o:p>

#017        x = tName(cx[j].getName(), classRef);<o:p></o:p>

#018 }<o:p></o:p>

#019 classRef.remove(c.getName()); //不必记录自己(不需import 自己)<o:p></o:p>

<o:p> </o:p>

执行结果(例):<o:p></o:p>

import java.util.ListIterator;<o:p></o:p>

import java.lang.Object;<o:p></o:p>

import java.util.LinkedList$Entry;<o:p></o:p>

import java.util.Collection;<o:p></o:p>

import java.io.ObjectOutputStream;<o:p></o:p>

import java.io.ObjectInputStream;<o:p></o:p>

5-2:找出导入的classes,动作细节详见内文说明。<o:p></o:p>

<o:p> </o:p>

#001 int mod = c.getModifiers();<o:p></o:p>

#002 System.out.print(Modifier.toString(mod)); //整个modifier<o:p></o:p>

#003<o:p></o:p>

#004 if (Modifier.isInterface(mod))<o:p></o:p>

#005    System.out.print(" "); //关键词 "interface" 已含于modifier<o:p></o:p>

#006 else<o:p></o:p>

#007    System.out.print(" class "); //关键词 "class"<o:p></o:p>

#008 System.out.print(tName(c.getName(), null)); //class 名称<o:p></o:p>

<o:p> </o:p>

执行结果(例):<o:p></o:p>

public class LinkedList<o:p></o:p>

5-3:找出classinterface 的名称,及其属性(modifiers)。<o:p></o:p>

<o:p> </o:p>

#001 TypeVariable<Class>[] tv;<o:p></o:p>

#002 tv = c.getTypeParameters(); //warning: unchecked conversion<o:p></o:p>

#003 for (int i = 0; i < tv.length; i++) {<o:p></o:p>

#004    x = tName(tv[i].getName(), null); //例如 E,K,V...<o:p></o:p>

#005    if (i == 0) //第一个<o:p></o:p>

#006        System.out.print("<" + x);<o:p></o:p>

#007    else //非第一个<o:p></o:p>

#008        System.out.print("," + x);<o:p></o:p>

#009    if (i == tv.length-1) //最后一个<o:p></o:p>

#010        System.out.println(">");<o:p></o:p>

#011 }<o:p></o:p>

<o:p> </o:p>

执行结果(例):<o:p></o:p>

public abstract interface Map<K,V><o:p></o:p>

public class LinkedList<E><o:p></o:p>

5-4:找出parameterized types 的名称<o:p></o:p>

<o:p> </o:p>

#001 Class supClass;<o:p></o:p>

#002 supClass = c.getSuperclass();<o:p></o:p>

#003 if (supClass != null) //如果有super class<o:p></o:p>

#004    System.out.print(" extends" +<o:p></o:p>

#005 tName(supClass.getName(),classRef));<o:p></o:p>

<o:p> </o:p>

执行结果(例):<o:p></o:p>

public class LinkedList<E><o:p></o:p>

extends AbstractSequentialList,<o:p></o:p>

5-5:找出base class。执行结果多出一个不该有的逗号于尾端。此非本处重点,为简化计,不多做处理。<o:p></o:p>

<o:p> </o:p>

#001 Class cc[];<o:p></o:p>

#002 Class ctmp;<o:p></o:p>

#003 //找出所有被实现的interfaces<o:p></o:p>

#004 cc = c.getInterfaces();<o:p></o:p>

#005 if (cc.length != 0)<o:p></o:p>

#006    System.out.print(", \r\n" + " implements "); //关键词<o:p></o:p>

#007 for (Class cite : cc) //JDK1.5 新式循环写法<o:p></o:p>

#008    System.out.print(tName(cite.getName(), null)+", ");<o:p></o:p>

<o:p> </o:p>

执行结果(例):<o:p></o:p>

public class LinkedList<E><o:p></o:p>

extends AbstractSequentialList,<o:p></o:p>

implements List, Queue, Cloneable, Serializable,<o:p></o:p>

5-6:找出implemented interfaces。执行结果多出一个不该有的逗号于尾端。此非本处重点,为简化计,不多做处理。<o:p></o:p>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值