java许多对象都有两种类型:编译时类型和运行时类型<br>例如:<br> Person p = new Student();<br>p的编译时类型是Person,运行时类型是Student<br><br>程序需要运行时发现对象和类的真实信息。一般有一下两种做法:<br>1,如果在编译和运行时都知道类型的具体信息,可以先使用instanceof判断下,在强转<br>2,编译时不知道该对象和类可能属于哪些类,只能依靠运行时信息来发现该对象和类的真实信息,这就需要反射
获得Class对象
获得Class对象的三种方法:<br>1,Class.forName( String clazzName) (必须是完整的包名)<br>2,类.class<br>3,对象.getClass()
从Class中获取信息
获取构造函数:<br><br>Constructor<T> getConstructor(Class<?>...parameterTypes):<br>返回参数对应的public构造函数<br><br>Constructor<?>[] getConstructors():获得所有的public构造器<br><br>Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes):<br>返回参数对应的构造函数<br><br>Constructor<?>getDeclaredConstructors():返回所有的构造函数
获取函数:<br>Method getMethod(String name, Class<?>...parameterTypes):返回指定参数的public方法<br>Method[] getMethods(): 返回所有的public方法<br>Method getDeclaredMethod(String name, Class<?>...parameterTypes) : 获取指定参数的方法<br>Method[] getDeclaredMethods():获取所有的方法
获取成员变量:<br>Field getField(String name) : 获取指定名称的public字段<br>Field[] getFields(): 返回所有的public字段<br>Field getDeclaredField(String name) : 返回指定名称字段<br>Field[] getDeclaredFields() : 返回所有的字段
获取注解:<br><A extends Annotation> A getAnnotation(Class<A> annotationClass) : <br>获取指定的Annotation; 如果不存在,则返回null<br><br><A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass) : <br>获取指定的类Annotation<br><br>Annotation[] getAnnotations() : 返回修饰该Class对象对应类上存在的所有Annotations<br><br>Annotation[] getDeclaredAnnotations() : 返回所有的类Annotation<br><br><A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass) : <br>获取指定的类Annotation<br><br><A extends Annotation> A[] getDeclaredAnnotationByType(Class<A> annotationClass) : <br>获取指定类型的多个类Annotation<br>
获取内部类:<br>Class<?>[] getDeclaredClasses() : 返回包含的额全部内部类<br><br>获取外部类:<br>Class<?> getDeclaringClass() : 返回外部类<br>
获取类实现的接口:<br>Class<?>[] getInterfaces() : 返回该类实现的所有接口<br><br>获取类所继承的父类<br>Class<? super T> getSuperclass() : 返回父类的Class对象 <br>
获取类的修饰符、所在包、类名等基本信息<br>int getModifiers():返回修饰符<br>Package getPackage() : 获取此类的包名<br>String getName() : 返回class的类名<br>String getSimpleName() : 返回class简称的类名<br><br>boolean isAnnotation():该class对象是否是注解(@interface)<br>boolean isAnnotationPresent(Class<? extends Annotation> annotationClass):该class对象是否使用了Annotation修饰<br>boolean isAnonymousClass():该class对象是否是一个匿名类<br>boolean isArray():该class对象是否表示一个数组类<br>boolean isEnum(): 该class对象是否表示一个枚举类<br>boolean isInterface():该class对象是否表示一个接口<br>boolean isInstance(Object obj): 判断obj是否是此Class对象的实例
8新增的方法参数反射
Executable 派生了 Constructor、method方法<br><br>int getParameterCount() : 获取构造器或方法的形参个数<br>Parameter[] getParameters() : 获取构造器或方法的所有形参
Parameter是8新增的,代表方法或构造器的一个参数<br>getModifiers() : 获取修饰符<br>String getName() : 获取形参名<br>Type getParameterizedType() : 获取带泛型的形参类型<br>Class<?> getType() : 获取形参类型<br>boolean isNamePresent() : class文件是否包含了方法的形参名信息<br>boolean isVarArgs() : 返回该参数是否是个数可变的形参<br>ps : 使用javac命令编译的java源文件,生成的Class文件不包含方法的形参名信息,<br> javac -parameters 源文件名 : 生成的Class文件则包含方法的形参信息