反射的概念及使用

反射是什么?

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));
posted @ 2026-02-14 16:47  goodguyly  阅读(4)  评论(0)    收藏  举报