深入分析Java反射(一)-核心类库和方法 (7)

在这里,Inner是Outter的无参数构造里面定义的构造内部类,它也只能在Outter的无参数构造里面使用,通过Inner的Class的getEnclosingConstructor()方法获取到的就是Outter的无参数构造。

getEnclosingMethod()方法使用例子:

public class Main7 { public static void main(String[] args) throws Exception { Outter outter = new Outter(); outter.print(); } public static class Outter { public void print(){ //方法print中定义的内部类 class Inner { } Class<Inner> innerClass = Inner.class; Class<?> enclosingClass = innerClass.getEnclosingClass(); System.out.println(enclosingClass.getName()); Method enclosingMethod = innerClass.getEnclosingMethod(); System.out.println(enclosingMethod.getName()); } } }

输出结果:

org.throwable.inherited.Main7$Outter print

在这里,Inner是Outter的print方法里面定义的方法内部类,它也只能在Outter的print方法里面使用,通过Inner的Class的getEnclosingMethod()方法获取到的就是Outter的print方法。这种方式可能不常用,但是可以在某版本的spring-jdbc的JdbcTemplate的源码中看到类似的类定义逻辑。

前面介绍过getXXX()方法和getDeclearedXXX()方法有所区别,这里做个对比表格:

Class中获取Field列表的方法:

Class中的API 获取所有的Field 包括继承的Field 包括私有的Field
getDeclaredField()   N   N   Y  
getField()   N   Y   N  
getDeclaredFields()   Y   N   Y  
getFields()   Y   Y   N  

Class中获取Method列表的方法:

Class中的API 获取所有的Method 包括继承的Method 包括私有的Method
getDeclaredMethod()   N   N   Y  
getMethod()   N   Y   N  
getDeclaredMethods()   Y   N   Y  
getMethods()   Y   Y   N  

Class中获取Constructor列表的方法:

Class中的API 获取所有的Constructor 包括私有的Constructor
getDeclaredConstructor()   N   Y    
getConstructor()   N   N    
getDeclaredConstructors()   Y   Y    
getConstructors()   Y   N    
Constructor类

Constructor用于描述一个类的构造函数。它除了能获取到构造的注解信息、参数的注解信息、参数的信息之外,还有一个很重要的作用是可以抑制修饰符进行实例化,而Class的实例化方法newInstance只能实例化修饰符为public的类。Constructor的主要方法如下:

方法 功能
Class<T> getDeclaringClass()   获取当前构造的定义类  
String getName()   获取当前构造的名称  
int getModifiers()   获取当前构造的修饰符  
String toGenericString()   返回描述此构造的字符串,其中包括类型参数的字面量  
TypeVariable<Constructor<T>>[] getTypeParameters()   获取类定义泛型参数的类型变量  
Class<?>[] getExceptionTypes()   获取当前构造异常类型数组,如果不存在则返回一个长度为0的数组  
Type[] getGenericExceptionTypes()   获取当前构造异常类型数组的泛型类型,如果不存在则返回一个长度为0的数组  
Type[] getGenericParameterTypes()   获取当前构造参数的泛型类型,如果不存在则返回一个长度为0的数组  
Annotation[][] getParameterAnnotations()   获取当前构造参数的注解数组,这里是二维数组的原因是一个参数可以使用多个注解  
int getParameterCount()   获取当前构造参数的数量  
Class<?>[] getParameterTypes()   获取当前构造参数的Class数组  
boolean isSynthetic()   当前构造是否复合的  
boolean isVarArgs()   当前构造是否使用不定参数  
T newInstance(Object...initargs)   使用此构造对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例  
Parameter[] getParameters()   返回此构造对象的参数Parameter数组,如果没有则返回一个长度为0的数组  
void setAccessible(boolean flag)   抑制构造访问修饰符的权限判断  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywspx.html