Java之Reflect

Class

Class没有public构造方法,由JVM在加载类时自动构造,Class实例中存储了Object对应类的元信息,获取Class实例有三种方式。

  1. Object.getClass()
  2. Class.forName()
  3. class literal, 即类名加.class

通过Class可获取类元信息,包括类声明、类中成员、方法等信息

类声明信息

类名

public String getCanonicalName(); 包含包名
public String getSimpleName(); 类名
public String getName();
public String getTypeName();
public Package getPackage();

public native Class<?> getComponentType(); 获取数组元素类型的信息
public TypeVariable<Class<T>>[] getTypeParameters();获取泛型类型

继承

public Class<?>[] getInterfaces();
public Type[] getGenericInterfaces();
public native Class<? super T> getSuperclass(); //所有继承类
public Type getGenericSuperclass(); 直接继承类

修饰

public native int getModifiers(); 

返回一个整数,代表修饰属性(private/public/protect/final/static/abstact),然后使用java.lang.refect.Modifier中的静态方法进行判断

注解

public Annotation[] getAnnotations();
public <A extends Annotation> A getAnnotation(Class<A> annotationClass);
public <A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass);
public AnnotatedType getAnnotatedSuperclass();
public AnnotatedType[] getAnnotatedInterfaces();

属性判断

public native boolean isAssignableFrom(Class<?> cls);
public native boolean isInterface();
public native boolean isArray();
public native boolean isPrimitive();
public boolean isAnnotation();
public boolean isSynthetic(); 合成即由编译器生成的
public boolean isAnonymousClass();
public boolean isLocalClass();
public boolean isMemberClass();

内部类

public Class<?>[] getClasses();
public Class<?>[] getDeclaredClasses();

成员

public Field[] getFields();
public Field getField(String name); //根据名字过去field
public Field[] getDeclaredFields(); //可获取private field
public Field getDeclaredField(String name);

获取Field后就可以get/set某个具体Object Instance上对应成员的值

方法

//构造方法
public Constructor<?>[] getConstructors();
public Constructor<T> getConstructor(Class<?>... parameterTypes); //根据参数类型获取
public Constructor<?>[] getDeclaredConstructors(); //可获取私有的
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);

//一般方法
public Method[] getMethods();
public Method getMethod(String name, Class<?>... parameterTypes) //根据名字及参数类型获取
public Method[] getDeclaredMethods();
public Method getDeclaredMethod(String name, Class<?>... parameterTypes);

获取Method后可以通过java.lang.refect.Method获取方法更多的信息,比如方法返回值类型、修饰信息、参数信息、注解等,通过invoke方法可以调用Object Instance上的当前方法。

public Object invoke(Object obj, Object... args)

猜你喜欢

转载自blog.csdn.net/jinjiating/article/details/79260611