四.反射获取类的结构信息
1.第一组:java.lang.Class类
1.getName:获取全类名2.getSimpleName:获取简单类名3.getFields:获取所有publicf修饰的属性,包含本类以及父类的4.getDeclaredFields:获取本类中所有属性5.getMethods:获取所有public修饰的方法,包含本类以及父类的6.getDeclaredMethods:获取本类中所有方法7.getConstructors:获取所有public修饰的构造器,包含本类8.getDeclaredConstructors:获取本类中所有构造器9.getPackage:以Package]形式返回包信息10.getSuperClass:以Class形式返回父类信息11.getInterfaces:以Class[]形式返回接口信息12.getAnnotations:以Annotation[]形式返回注解信息
/**
* @author LeeZhi
* @version 1.0
* 演示如何通过反射获取类的结构信息
*/
publicclassReflectionUtils {
publicstaticvoidmain(String[] args) {
}
//第一组方法API
@Test
publicvoidapi_01() throwsClassNotFoundException {
/**
* 1.getName:获取全类名
* 2.getSimpleName:获取简单类名
* 3.getFields:获取所有publicf修饰的属性,包含本类以及父类的
* 4.getDeclaredFields:获取本类中所有属性
* 5.getMethods:获取所有public修饰的方法,包含本类以及父类的
* 6.getDeclaredMethods:获取本类中所有方法
* 7.getConstructors:获取本类所有public修饰的构造器
* 8.getDeclaredConstructors:获取本类中所有构造器
* 9.getPackage:以Package]形式返回包信息
* 10.getSuperClass:以Class形式返回父类信息
* 11.getInterfaces:以Class[]形式返回接口信息
* 12.getAnnotations:以Annotation[]形式返回注解信息
*/
//1.得到Class对象
Class<?>personCls=Class.forName("com.gbx.reflection.Person");
System.out.println(personCls.getName());
System.out.println(personCls.getSimpleName());
Field[] fields=personCls.getFields();
for (Fieldfield : fields) {
System.out.println("本类以及父类的属性:"+field.getName());
}
Field[] declaredFields=personCls.getDeclaredFields();
for (FielddeclaredField : declaredFields) {
System.out.println("本类所有属性:"+declaredField.getName());
}
Method[] methods=personCls.getMethods();
for (Methodmethod : methods) {
System.out.println("本类及父类的方法:"+method.getName());
}
Method[] declaredMethods=personCls.getDeclaredMethods();
for (MethoddeclaredMethod : declaredMethods) {
System.out.println("本类所有方法:"+declaredMethod.getName());
}
Constructor<?>[] constructors=personCls.getConstructors();
for (Constructor<?>constructor : constructors) {
System.out.println("本类的构造器:"+constructor.getName());
}
Constructor<?>[] declaredConstructors=personCls.getDeclaredConstructors();
for (Constructor<?>declaredConstructor : declaredConstructors) {
System.out.println("本类中所有构造器:"+declaredConstructor.getName());
}
System.out.println(personCls.getPackage());
Class<?>superclass=personCls.getSuperclass();
System.out.println("父类的class对象"+superclass);
Class<?>[] interfaces=personCls.getInterfaces();
for (Class<?>anInterface : interfaces) {
System.out.println("接口信息:"+anInterface);
}
Annotation[] annotations=personCls.getAnnotations();
for (Annotationannotation : annotations) {
System.out.println("注解信息:"+annotation);
}
}
}
classA{
publicStringhobby;
publicvoidhi(){
}
publicA() {
}
}
interfaceIA{
}
interfaceIB{
}
classPersonextendsAimplementsIA,IB{
//属性
publicStringname;
protectedintage;
Stringjob;
privatedoublesal;
publicPerson() {
}
publicPerson(Stringname) {
this.name=name;
}
privatePerson(Stringname,intage){
}
//方法
publicvoidm1(){
}
protectedvoidm2(){
}
voidm3(){
}
privatevoidm4(){
}
}
2.第二组:java.lang.reflect.Field类
1.getModifiers:以int形式返回修饰符[说明:默认修饰符是0,public是1,private是2,protected是4,static是8,final是16] public(1)+static (8)=92.getType:以Class形式返回类型3.getName:返回属性名
@Test
publicvoidapi_02() throwsClassNotFoundException {
//1.得到Class对象
Class<?>personCls=Class.forName("com.gbx.reflection.Person");
Field[] declaredFields=personCls.getDeclaredFields();
for (FielddeclaredField : declaredFields) {
System.out.println("本类所有属性:"+declaredField.getName()
+"该属性的修饰值:"+declaredField.getModifiers()
+"该属性的类型"+declaredField.getType());
}
}
3.第三组:java.lang.reflect.Method类
1.getModifiers:以int形式返回修饰符[说明:默认修饰符是0,public是1,private是2,protected是4,static是8,final是16]2.getReturnType:以Classj形式获取返回类型3.getName:返回方法名4.getParameterTypes:以Class[]返回参数类型数组
Method[] declaredMethods=personCls.getDeclaredMethods(); for (MethoddeclaredMethod : declaredMethods) { System.out.println("本类所有方法:"+declaredMethod.getName() +"该方法的访问修饰符"+declaredMethod.getModifiers() +"该方法返回类型"+declaredMethod.getReturnType()); //输出当前这个方法的形参数组情况Class<?>[] parameterTypes=declaredMethod.getParameterTypes(); for (Class<?>parameterType : parameterTypes) { System.out.println("该方法形参类型:"+parameterType); } }
4.第四组:java.lang.reflect.Constructor类
1.getModifiers:以int形式返回修饰符2.getName:返回构造器名(全类名)3.getParameterTypes:以Class[]返回参数类型数组
Constructor<?>[] declaredConstructors=personCls.getDeclaredConstructors(); for (Constructor<?>declaredConstructor : declaredConstructors) { System.out.println("本类中所有构造器:"+declaredConstructor.getName()); Class<?>[] parameterTypes=declaredConstructor.getParameterTypes(); for (Class<?>parameterType : parameterTypes) { System.out.println("该构造器的形参类型:"+parameterType); } }