欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java之Reflect

程序员文章站 2024-02-20 19:36:40
...

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)
相关标签: java 反射