初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值。Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的cl ...
初识Java反射机制:
从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值。Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的内部信息(包括其modifiers(如public, static等)、superclass(如Object)、interfaces(如Serializable),也包括fields和methods的所有信息),动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法)。这种反射机制为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 API
的描述:
Class
类的实例表示正在运行的 Java应用程序中的类和接口。基本的Java类型(boolean
、byte
、char
、short
、int
、long
、float
和double
)和关键字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对象,附表如下,两边等价:
(2)获取类名:从Class对象中可以获取两个不同的类名。
A、完整类名(包括包名)可以使用getName()或getCanonicalName()方法获取
示例:
Class c = MyObject.class;String className = c.getName();
原标题:Java:反射
关键词:JAVA
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。