反射(个人理解)
1、Class 类
在程序运行期间,Java 运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。 虚拟机利用运行时类型信息选择相应的方法执行。,Class在内存中存储属于单例模式,同一个类型对应的
class对象是同一个,可以直接用==判断是否相等。
获取Class对象的方式:
方式1:如果 T 是任意的 Java 类型(或 void 关键字,)T.class 将代表匹配的类对象。 例如:Object类型、int类型、void类...都是可以的。
方式2:Object 类中的 getClass( ) 方法将会返回一个 Class 类型的实例。
方式3:还可以调用静态方法 forName 获得类名对应的 Class 对象。 如:Class cl = Cl ass.forName(dassName) ; classname为完整类名。
补充:
Class常用方法:
*getName():Class对象调用时返回的是类的完全限定名称。
*newlnstance( ) :可以用来动态地创建一个类的实现,newlnstance 方法调用默认的构造器 (没有参数的构造器)初始化新创建的对象。 如果这个类没有默认的构造器, 就会抛出一个异常
如:Object m = Cl ass.forName(s) .newlnstance(); 如果需要以这种方式向希望按名称创建的类的构造器提供参数, 就不要使用上面那条语句,而必须使用 Constructor 类中的 newlnstance 方法。 *Field[] getFields() :getFields 方法将返回一个包含 Field 对象的数组, 这些对象记录了这个类或其超类的公有域。 *Filed[] getDeclaredFie1ds() :getDeclaredField 方法也将返回包含 Field 对象的数组, 这些对象记录了这个类的全部域,无法获取超类的域字段。 补充:如果类中没有域, 或者 Class 对象描述的是基本类型或数组类型, getFields()与getDeclaredFie1ds()将返回一个长度为 0 的数组,这句话也可以这么理解,如果此Class对象描述的类为没有域,或者是
基本类型的class对象,数组类型的class对象时(如int.class,Student[].class),getFields()与getDeclaredFie1ds()将返回一个长度为 0 的数组。
*Field[] getFields() :getFields 方法将返回一个包含 Field 对象的数组, 这些对象记录了这个类或其超类的公有域。
*Filed[] getDeclaredFie1ds() :getDeclaredField 方法也将返回包含 Field 对象的数组, 这些对象记录了这个类的全部域。 这些对象只记录这个类定义的域,不包括超类的域。
*Field getField( String name ) :返回指定名称的公有域
*Field getDeclaredField( String name ) :返回类中声明的给定名称的域
*Constructor[] getConstructors():获的此类所有的共有的构造方法。
*Constructor[] getDeclaredConstructors():获的此类的所有的构造方法。
*getConstructor(Class<?>...parameterTypes):更据参数类型数组获取此类具体的公有构造方法。
*
