`
primer_2004
  • 浏览: 129397 次
  • 性别: 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动态特性的关键所在。通过本文,我们将深入探讨Java反射...

    JAVA反射机制应用

    JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...

    java反射机制源码

    java反射机制源码java反射机制源码java反射机制源码

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    Java反射机制课件ppt

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...

    java反射机制核心代码

    java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);

    Java反射机制笔记(简单易懂)

    Java反射机制笔记 Java反射机制是Java语言中一个强大的功能,它允许程序在运行时检查和修改其自身的结构和行为。通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态...

    java反射机制详解

    ### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    java反射机制讲解

    Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...

    Java反射机制

    ### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...

    java反射机制,很安逸.不要错过

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...

    候捷的java精髓

    通过阅读《候捷的Java精髓》,Java开发者可以深入理解语言的内在机制,提高代码质量,同时也能学习到如何解决实际开发中遇到的问题。书中的例子丰富、实用,便于读者理解和掌握。文件"art-java-b5-20050422-2ch.pdf...

    Java反射机制的学习

    Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...

    Reflection_in_Java.zip_in_java 反射_java 反射机制_java反射_反射机制

    Java反射机制是Java编程语言中一个强大的特性,它允许运行时的程序动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`...

    Java反射机制经典案例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至能够在不知道具体类名的情况下创建和调用对象的方法。这为程序员提供了高度的灵活性和动态性,使得Java...

Global site tag (gtag.js) - Google Analytics