反射的概念及使用
反射是什么?
JVM对类进行加载的时候,会给每个class创建一个Class类的实例,Class为类的名称。如String类会创建一个Class类实例,该实例中包含了String类信息如包、父类、接口、方法、属性。从该Class实例中获取类的信息就是反射。
3中获取Class实例的方法
Class<String> stringClass = String.class;
Class<? extends String> aClass = "hello".getClass();
try {
Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
java类动态加载机制
只有类被用到的时候才会去加载类
获取字段
Field getField(name):根据字段名获取某个public的field(包括父类)
Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
Field[] getFields():获取所有public的field(包括父类)
Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
一个Field对象包含了一个字段的所有信息:
getName():返回字段名称,例如,"name";
getType():返回字段类型,也是一个Class实例,例如,String.class;
getModifiers():返回字段的修饰符,它是一个int,不同的bit表示不同的含义。
字段获取
f.get(obj)
f.set(obj, value)
获取方法
Method getMethod(name, Class...):获取某个public的Method(包括父类)
Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)
Method[] getMethods():获取所有public的Method(包括父类)
Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)
方法调用
m.invoke(obj, params_class_type)
获取构造函数
getConstructor(Class...):获取某个public的Constructor;
getDeclaredConstructor(Class...):获取某个Constructor;
getConstructors():获取所有public的Constructor;
getDeclaredConstructors():获取所有Constructor。
获取父类和接口
Class<? super String> superclass = String.class.getSuperclass();
System.out.println(superclass);
Class<?>[] interfaces = String.class.getInterfaces();
System.out.println(Arrays.toString(interfaces));

浙公网安备 33010602011771号