JaVA 反射机制-1

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

JAVA 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

 

       可以动态获取和调用类的属性和方法,如果你不知道一个类有什么属性和方法,可以利用反射机制获取,比如eclipse中当你在对象之后输入"."的时候会有一个下拉框显示属性和方法让你选择,就是利用了反射机制。

      

      

       JAVA反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法。一般都是在配置文件中才用的。hibernate的映射文件,spring的配置文件都是通过反射做的。

 

     众所周知Java中有个Object class,是所有Java classes的继承根源,其内生命了数个应该在所有 Java class 中被改写的methodshashCode()equals()clone()

toString()getClass() 等。其中getClass() 返回一个Class object

      Class class 十分特殊。它和一般classes 一样继承自Object,其实体用以表达Java程序运行时的 classes interfaces,也用来表达 enumarrayprimitve Java Types(booelanbytecharshortintlongfloatdouble)以及关键词void 当一个class被加载,或者加载器(class loader)的defineClass() JVM调用,JVM便自动产生一个Class object。如果您想借由“修改Java标准库源码”来观察Class object的实际生成时机(例如在Class constructor内添加一个println() ),这样是行不通的!因为Class 并没有public constructor。本文章最后悔拨一小块篇幅顺带谈谈Java标准库源码的改动方法。

Class Reflection 故事起源。针对任何您想探勘的 class,唯有先为它产生一个 Class object,接下来才能由后者唤起为数十多个的 Reflection APIs。这些APIs将在稍后的一一讲解。

public final

 class Class<T> implements Serializable,

   java.lang.reflect.GenericDeclaration,

   java.lang.reflect.Type,

   java.lang.reflect.AnnotatedElement {

   private Class() {}

   public String toString() {

      return ( isInterface() ? "interface " :

         (isPrimitive() ? "" : "class "))

         + getName();

   }

....

}

注意它的private Class() {},意指不允许任何人经由编程方式产生Class object。是的,其object 只能由JVM 产生。

“Class” object的取得途径

Java允许我们从多种管道为一个class生成对应的Class object

Class object 诞生管道

1)运用 getClass()  对象.getClass( )

       注:每个class 都有此函数

2)运用 static method

       Class.forName() //完整的 .类名

3)运用  primitive wrapper classes 或者 类名.class

Class c1 = Boolean.TYPE;

Class c2 = Byte.TYPE;

Java classes 组成分析

首先容我以java.util.LinkedList为例,将Java class的定义大卸八块,每一块分别对应不同的 Reflection API。图5则是“获得class各区块信息”的程序示例及执行结果,它们都取自本文示例程序的对应片段。

 

 package java.util; //(1)

 import java.lang.*; //(2)

 public class LinkedList<E> //(3)(4)(5)

 extends AbstractSequentialList<E> //(6)

 implements List<E>, Queue<E>,

 Cloneable, java.io.Serializable //(7)

 {

 private static class Entry<E> { … }//(8)

 public LinkedList() { … } //(9)

 public LinkedList(Collection<? extends E> c) { … }

 public E getFirst() { … } //(10)

 public E getLast() { … }

 private transient Entry<E> header = …; //(11)

 private transient int size = 0;

 }

 

(1) package   class隶属哪个package

  Package getPackage()

          获取此类的包。

(2) import    class导入哪些classes

   无直接对应之API

(3) modifier   class(或methods, fields)的修饰符

  int getModifiers()

  Modifier.toString(int)

  Modifier.isInterface(int)

 

(4) class name or interface name

  class/interface名称.getName()

  String

(5) type parameters  参数化类型的名称

  TypeVariable<Class<T>>[]  getTypeParameters() 

(6) base class

  base class(只可能一个)

  getSuperClass()

Class

(7) implemented interfaces

  实现有哪些interfaces

  getInterfaces()

  Class[]

(8) inner classes

  内部classes

  getDeclaredClasses()

  Class[]

(8') outer class

  如果我们观察的class 本身是inner classes,那么相对它就会有个outer class

  getDeclaringClass()

  Class

(9) constructors

  构造函数getDeclaredConstructors()

  不论 public private 或其它access level,皆可获得。另有功能近似之取得函数。

  Constructor[]

(10) methods

  操作函数getDeclaredMethods()

  不论 public private 或其它access level,皆可获得。另有功能近似之取得函数。

  Method[]

(11) fields

  字段(成员变量)

  getDeclaredFields()不论 public private 或其它access level,皆可获得。另有功能近似之取得函数。

Field[]

 

接下来讨论Reflection 的另三个动态性质:

(1) 运行时生成instances

(2) 执行期唤起methods

(3) 运行时改动fields

  接下来讨论Reflection 的另三个动态性质:

(1) 运行时生成instances

(2) 执行期唤起methods

(3) 运行时改动fields

  


你可能感兴趣的:(java)