`
primer_2004
  • 浏览: 127971 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

候捷谈Java反射机制(4)

    博客分类:
  • Java
阅读更多

#001 cc = c.getDeclaredClasses(); //找出inner classes<o:p></o:p>

#002 for (Class cite : cc)<o:p></o:p>

#003    System.out.println(tName(cite.getName(), null));<o:p></o:p>

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

#005 ctmp = c.getDeclaringClass(); //找出outer classes<o:p></o:p>

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

#007    System.out.println(ctmp.getName());<o:p></o:p>

<o:p> </o:p>

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

LinkedList$Entry<o:p></o:p>

LinkedList$ListItr<o:p></o:p>

5-7:找出inner classes outer class<o:p></o:p>

<o:p> </o:p>

#001 Constructor cn[];<o:p></o:p>

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

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

#004    int md = cn[i].getModifiers();<o:p></o:p>

#005    System.out.print(" " + Modifier.toString(md) + " " +<o:p></o:p>

#006    cn[i].getName());<o:p></o:p>

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

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

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

#010        System.out.print(tName(cx[j].getName(), null));<o:p></o:p>

#011        if (j < (cx.length - 1)) System.out.print(", ");<o:p></o:p>

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

#013    System.out.print(")");<o:p></o:p>

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

<o:p> </o:p>

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

public java.util.LinkedList(Collection)<o:p></o:p>

public java.util.LinkedList()<o:p></o:p>

5<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="8" unitname="a">-8a</st1:chmetcnv>:找出所有constructors<o:p></o:p>

<o:p> </o:p>

#004 System.out.println(cn[i].toGenericString());<o:p></o:p>

<o:p> </o:p>

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

public java.util.LinkedList(java.util.Collection<? extends E>)<o:p></o:p>

public java.util.LinkedList()<o:p></o:p>

5-8b:找出所有constructors。本例在for 循环内使用toGenericString(),省事。<o:p></o:p>

<o:p> </o:p>

#001 Method mm[];<o:p></o:p>

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

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

#004    int md = mm[i].getModifiers();<o:p></o:p>

#005    System.out.print(" "+Modifier.toString(md)+" "+<o:p></o:p>

#006    tName(mm[i].getReturnType().getName(), null)+" "+<o:p></o:p>

#<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="7" unitname="mm">007    </st1:chmetcnv>mm[i].getName());<o:p></o:p>

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

#009    System.out.print("(");<o:p></o:p>

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

#011        System.out.print(tName(cx[j].getName(), null));<o:p></o:p>

#012    if (j < (cx.length - 1)) System.out.print(", ");<o:p></o:p>

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

#014    System.out.print(")");<o:p></o:p>

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

<o:p> </o:p>

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

public Object get(int)<o:p></o:p>

public int size()<o:p></o:p>

5<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="9" unitname="a">-9a</st1:chmetcnv>:找出所有methods<o:p></o:p>

<o:p> </o:p>

#004 System.out.println(mm[i].toGenericString());<o:p></o:p>

<o:p> </o:p>

public E java.util.LinkedList.get(int)<o:p></o:p>

public int java.util.LinkedList.size()<o:p></o:p>

5-9b:找出所有methods。本例在for 循环内使用toGenericString(),省事。<o:p></o:p>

<o:p> </o:p>

#001 Field ff[];<o:p></o:p>

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

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

#004    int md = ff[i].getModifiers();<o:p></o:p>

#005    System.out.println(" "+Modifier.toString(md)+" "+<o:p></o:p>

#006    tName(ff[i].getType().getName(), null) +" "+<o:p></o:p>

#007    ff[i].getName()+";");<o:p></o:p>

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

<o:p> </o:p>

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

private transient LinkedList$Entry header;<o:p></o:p>

private transient int size;<o:p></o:p>

5<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="10" unitname="a">-10a</st1:chmetcnv>:找出所有fields<o:p></o:p>

<o:p> </o:p>

#004 System.out.println("G: " + ff[i].toGenericString());<o:p></o:p>

<o:p> </o:p>

private transient java.util.LinkedList.java.util.LinkedList$Entry<E> ??<o:p></o:p>

java.util.LinkedList.header<o:p></o:p>

private transient int java.util.LinkedList.size<o:p></o:p>

5-10b:找出所有fields。本例在for 循环内使用toGenericString(),省事。<o:p></o:p>

<o:p> </o:p>

找出class参用(导入)的所有classes<o:p></o:p>

没有直接可用的Reflection API可以为我们找出某个class参用的所有其它classes。要获得这项信息,必须做苦工,一步一脚印逐一记录。我们必须观察所有fields的类型、所有methods(包括constructors)的参数类型和回返类型,剔除重复,留下唯一。这正是为什么5-2程序代码要为tName()指定一个hashtable(而非一个null)做为第二自变量的缘故:hashtable可为我们储存元素(本例为字符串),又保证不重复。<o:p></o:p>

<o:p> </o:p>

本文讨论至此,几乎可以还原一个class的原貌(唯有methods ctors的定义无法取得)。接下来讨论Reflection 的另三个动态性质:(1) 运行时生成instances(2) <o:p></o:p>

行期唤起methods(3) 运行时改动fields

分享到:
评论

相关推荐

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    候捷的java精髓

    7. **反射机制**:深入理解Java反射的概念,如何在运行时动态访问类、接口、方法和构造器。 8. **设计模式**:讲解常用的设计模式,如单例、工厂、观察者、装饰者、代理等,以及如何在实际开发中应用。 9. **JVM...

    反射机制

    这篇《候捷谈Java反射机制》的文章应该深入探讨了这一主题。 反射的核心概念主要包括Class类、Constructor类、Method类和Field类。以下是对这些关键知识点的详细说明: 1. **Class类**:在Java中,每个类都有一个...

    侯捷-Java编程思想+第2版(繁体版)

    - **异常处理**:详细讲解Java中的异常处理机制,包括异常的抛出、捕获及处理策略,帮助开发者编写健壮的应用程序。 - **泛型与集合框架**:重点介绍了Java泛型的概念及其在集合框架中的应用,使开发者能够写出类型...

    北京金卫捷科技发展有限公司Java笔试题

    7. **反射机制**:利用反射动态获取类的信息,创建对象,调用方法,修改字段值,了解Class类和Method类的使用。 8. **设计模式**:常见的设计模式如工厂模式、单例模式、观察者模式、装饰者模式等,理解其应用场景...

    Practical Java一书及代码

    8. **反射与动态代理**:Java的反射机制能让我们在运行时检查类的信息并操作对象,动态代理则能在运行时创建具有特定接口的代理类,这对于AOP(面向切面编程)和插件式系统很有用。 9. **Java EE基础**:虽然不是...

    Android程序员简历最新版

    2. **Java技术**:精通Java核心技术,包括反射、集合、网络编程和IO流的使用。 3. **Web应用开发**:熟练运用jsp、servlet、JSTL/EL、dom4j和JDBC,具备Struts2、Spring、Hibernate等主流框架的实践经验。 4. **...

Global site tag (gtag.js) - Google Analytics