你的位置:首页 > 软件开发 > Java > Java:反射

Java:反射

发布时间:2016-04-10 23:00:22
初识Java反射机制:  从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值。Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的cl ...

Java:反射

初识Java反射机制:

Java:反射

  从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值。Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的内部信息(包括其modifiers(如public, static等)、superclass(如Object)、interfaces(如Serializable),也包括fields和methods的所有信息),动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法)。这种反射机制为Java本身带来了动态性,是一个非常强大的工具,能够让代码变得更加灵活。

 

各种反射用法简单示例:

Java:反射

Java:反射

Java:反射

Java:反射

 

细说Java反射机制:

 

此处参考了这篇文章:Java反射机制  http://blog.csdn.net/jackiehff/article/details/8509075

 

(1)Class对象

  Class对象是Java反射的基础,它包含了与类相关的信息,实际上,Class对象是用来创建类的所有对象的。Class对象是java.lang.Class<T>这个类生成的对象,其中参数T表示用此Class对象建模的类的类型。例如,String.class的类型是 Class<String>;如果被建模的类的类型未知,则使用Class<?>,下图有所体现:

Java:反射

以下是Java API的描述:

  Class类的实例表示正在运行的 Java应用程序中的类和接口基本的Java类型(booleanbytecharshortintlongfloatdouble)和关键字void也表示为Class对象。所有具有相同元素类型和维数的数组都共享同一个Class对象。

  实际上,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象(更恰当的说,是被保存在一个同名的.class文件中)。如果我们想生成某个类的对象,运行这个程序的虚拟机(JVM)将使用类加载器检查这个类的Class对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件,并将其载入,一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

  Class没有公共构造方法,Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的,获取Class对象有三种方式:

A、通过实例变量的getClass()方法。

示例:Class c = new String("abc").getClass();

B、通过Class类的静态方法——forName()来实现。

示例:Class c =Class.forName("className");

注:当使用Class.forName()方法时,你必须提供完整类名(类名要包括包名)。例如,如果MyObject是位于包com.test下,那么类的完整类名是com.test.MyObject。如果运行时在类路径上找不到指定的类,Class.forName()方**抛出一个ClassNotFoundException。

C、使用类字面常量或TYPE字段。

示例:Class c = MyObject.class;

类字面常量不仅可以应用于普通的类,也可以应用于接口、数组以及基本数据类型,这种方式不仅更简单,而且更安全,因为它在编译时就会受到检查,并且根除了对forName方法的调用,所以也更高效,建议使用“.class”的形式。

Class c = Integer.TYPE;

TYPE是基本数据类型的包装类型的一个标准字段,它是一个引用,指向对应的基本数据类型的Class对象,附表如下,两边等价:

Java:反射

(2)获取类名:从Class对象中可以获取两个不同的类名。

A、完整类名(包括包名)可以使用getName()或getCanonicalName()方法获取

示例:

Class c = MyObject.class;String className = c.getName();

原标题:Java:反射

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。