Java之Reflect
程序员文章站
2024-02-20 19:36:40
...
Class
Class没有public构造方法,由JVM在加载类时自动构造,Class实例中存储了Object对应类的元信息,获取Class实例有三种方式。
- Object.getClass()
- Class.forName()
- 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)
上一篇: 关于js中funcntion的参数默认值
下一篇: js函数参数默认值