java反射1

反射:通过Class实例获取class信息的方法称为反射(Reflection)
获取class的class实例
方法一:通过一个class的静态变量class获取
Class 变量名=String.class
方法二:通过实例提供的getClass()获得
Class 变量名=实例.getClass()
方法三:如果知道一个class的完整类名,可以通过静态方法class.forName()
Class 变量名=Class.forName(类名字符串)

Class实例在JVM是唯一的因此可以用==比较两个Class实例
Class比较与instanceof区别用instanceof不但匹配指定类型,还匹配指定类型的子类。
而用==判断class实例可以精确地判断数据类型,但不能作子类型比较

打印Class实例信息:
static void printClassInfo(Class cls) {
System.out.println("Class name: " + cls.getName());
System.out.println("Simple name: " + cls.getSimpleName());
if (cls.getPackage() != null) {
System.out.println("Package name: " + cls.getPackage().getName());
}
System.out.println("is interface: " + cls.isInterface());
System.out.println("is enum: " + cls.isEnum());
System.out.println("is array: " + cls.isArray());
System.out.println("is primitive: " + cls.isPrimitive());
}

使用Class实例创建对应类型实例 它的局限是:只能调用public的无参数构造方法。带参数的构造方法,或者非public的构造方法都无法通过Class.newInstance()被调用
// 获取String的Class实例:
Class cls = String.class;
// 创建一个String实例:
String s = (String) cls.newInstance()

通过Class实例访问字段
Class实例.getField(字段名称字符串可选):根据字段名获取某个public的字段(包括父类)
Class实例.getDeclaredField(字段名称字符串可选):根据字段名获取当前类的某个public的字段(不包括父类)
一个Field对象包含一个字段的所有信息如:
Field.getName():返回字段名称,例如,"name";
Field.getType():返回字段类型,也是一个Class实例,例如,String.class;
Field.getModifiers():返回字段的修饰符,它是一个int,不同的bit表示不同的含义
Field.get(指定实例): 获取指定实例的指定字段的值(无法访问private)
Field.set(指定实例,修改的值)

通过Class实例访问方法
Class实例.getMethod(方法名,方法的类型Class) 若方法是返回String String.class 获取某个public的Method(包括父类)
Class实例.getDeclaredMethod(name, Class...):获取当前类的某个方法(不包括父类)

一个Method对象包含一个方法的所有信息:
getName():返回方法名称,例如:"getScore";
getReturnType():返回方法返回值类型,也是一个Class实例,例如:String.class;
getParameterTypes():返回方法的参数类型,是一个Class数组,例如:{String.class, int.class};
getModifiers():返回方法的修饰符,它是一个int,不同的bit表示不同的含义。

Method对象.invoke(指定实例,参数) 若是调用一个静态方法指定实例永远为null
反射方法 遵从多态原则

通过Class实例调用方法
Class实例.getConstructor(Class...) 获取某个public的Constructor(构造方法)
Class实例.getDeclaredConstructor(Class...):获取某个Constructor;
Constructor实例.newInstance(构造参数);调用构造方法

posted @ 2020-06-01 15:26  max!  阅读(88)  评论(0编辑  收藏  举报