转自:https://blog.youkuaiyun.com/TimHeath/article/details/53305528
1. 获取Class对象
要想解剖一个类,得先获得它,一个类是用类Class描述的,所以一个类就是一个Class对象,下面有三种方法可以获取一个类的Class对象。此处获取Person类的Class对象,假设Person的全限定类名为edu.jyu.reflect.Person。
- Class类的forName()静态方法,Class clazz = Class.forName(“edu.jyu.reflect.Person”);
- 调用某个类的class属性,Class clazz = Person.class;
- 调用每个类的实例对象的getClass()方法,Class clazz = new Person().getClass();
2. 获取构造函数
类的构造方法,是用java.lang.reflect包中的类Constructor表示的,获取一个类的构造函数,有以下几个方法
- Constructor[] getDeclaredConstructors();返回已加载类声明的所有的构造方法(包括private修饰)的Constructor 对象数组.
- Constructor getDeclaredConstructor(Class[] paramTypes);返回已加载类声明的指定构造方法的Constructor 对象,paramTypes指定了参数类型.
- Constructor[] getConstructors();返回已加载类声明的所有的 public类型的构
造方法的Constructor 对象数组. - Constructor getConstructor(Class[] paramTypes);返回已加载类声明的指定
的public类型的构造方法的Constructor对象,paramTypes指定了参数类型
3. 获取字段
类的字段,是用java.lang.reflect包中的类Field表示的,获取一个类的字段,有以下几个方法
- Field[] getDeclaredFields():返回已加载类声明的所有字段的Field对象数
组,不包括从父类继承的字段. - Field getDeclaredField(String name):返回已加载类声明的所有字段的
Field对象,不包括从父类继承的字段,参数name指定字段的名称. - Field[] getFields():返回已加载类声明的所有public型的字段的Field对象
数组,包括从父类继承的字段 - Field getField(String name):返回已加载类声明的所有字段的 Field对象,
包括从父类继承的字段,参数name指定字段的名称
4. 获取方法
类的方法,是用java.lang.reflect包中的类Method表示的,获取一个类的方法,有以下几个方法
- Method[] getDeclaredMethods():返回已加载类声明的所有方法的 Method 对象数组,不包括从父类继承的方法.
- Method getDeclaredMethod(String name,Class[] paramTypes):返回已加载类声明的所有方法的 Method对象,不包括从父类继承的方法,参数name指定方
法的名称,参数 paramTypes指定方法的参数类型. - Method[] getMethods():返回已加载类声明的所有方法的Method对象数组,包
括从父类继承的方法. - Method getMethod(String name,Class[] paramTypes):返回已加载类声明的
所有方法的Method对象,包括从父类继承的方法,参数name指定方法的名称,参
数paramTypes指定方法的参数类型
大家可以观察到,获取类方法的这几个方法与获取类的字段十分相像,所以在此便不再多解释了。
5. 获取其它信息
当你得到一个类的Class对象的时候,基本上你就可以获取它的全部信息了,除了构造方法,字段,方法外还有一些类的包名、父类等等信息,如下面这几种。
- int getModifiers():返回已加载类的修饰符的整形标识值.
- Package getPackage():返回已加载类的包名
- Class getSuperclass():返回已加载类的父类的 Class实例.
- Class [] getInterfaces():返回已加载类实现的接口的 Class对象数组.
- boolean isInterface():返回已加载类是否是接口