通过反射获取对象信息
阅读:246录介绍
- 01.获取class对象的信息
- 03.获取对象的变量
- 04.获取class对象的方法
- 05.获取class对象的构造函数
- 06.获取方法属性
- 07.获取对象信息案例
01.获取class对象的信息
- 由于反射最终也必须有类参与,因此反射的组成一般有下面几个方面组成:
- 1.java.lang.Class.java:类对象;
- 2.java.lang.reflect.Constructor.java:类的构造器对象;
- 3.java.lang.reflect.Method.java:类的方法对象;
- 4.java.lang.reflect.Field.java:类的属性对象;
- 这个就比较多了……
boolean isPrimitive = class1.isPrimitive();//判断是否是基础类型 boolean isArray = class1.isArray();//判断是否是集合类 boolean isAnnotation = class1.isAnnotation();//判断是否是注解类 boolean isInterface = class1.isInterface();//判断是否是接口类 boolean isEnum = class1.isEnum();//判断是否是枚举类 boolean isAnonymousClass = class1.isAnonymousClass();//判断是否是匿名内部类 boolean isAnnotationPresent = class1.isAnnotationPresent(Deprecated.class);//判断是否被某个注解类修饰 String className = class1.getName();//获取class名字 包含包名路径 Package aPackage = class1.getPackage();//获取class的包信息 String simpleName = class1.getSimpleName();//获取class类名 int modifiers = class1.getModifiers();//获取class访问权限 Class<?>[] declaredClasses = class1.getDeclaredClasses();//内部类 Class<?> declaringClass = class1.getDeclaringClass();//外部类
- A:获取所有构造方法
- public Constructor<?>[] getConstructors()
- public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法
- B:获取单个构造方法
- public Constructor getConstructor(Class<?>... parameterTypes)
- public Constructor getDeclaredConstructor(Class<?>... parameterTypes)
- C:方法关键字
- getDeclareMethods() 获取所有的方法
- getReturnType() 获取方法的返回值类型
- getParameterTypes() 获取方法的传入参数类型
- getDeclareMethod("方法名,参数类型.class,....") 获得特定的方法
- D:成员变量
- getDeclaredFields 获取所有成员变量
- getDeclaredField(参数类型.class,....) 获取特定的成员变量
- E:父类和父接口
- getSuperclass() 获取某类的父类
- getInterfaces() 获取某类实现的接口
03.获取对象的变量
- 获取class对象的成员变量
Field[] allFields = class1.getDeclaredFields();//获取class对象的所有属性 Field[] publicFields = class1.getFields();//获取class对象的public属性 Field ageField = class1.getDeclaredField("age");//获取class指定属性 Field desField = class1.getField("des");//获取class指定的public属性
- 实际案例代码
private void method4() { Student student = new Student(); Class<? extends Student> cl = student.getClass(); Field[] fields = cl.getFields(); for (int i=0 ; i<fields.length ; i++){ Field met = fields[i]; String name = met.getName(); Annotation[] declaredAnnotations = met.getDeclaredAnnotations(); int modifiers = met.getModifiers(); LogUtils.i("获取class对象的public属性:"+name+"----"+declaredAnnotations.length); } Field[] declaredFields = cl.getDeclaredFields(); for (int i=0 ; i<declaredFields.length ; i++){ Field met = declaredFields[i]; String name = met.getName(); Annotation[] declaredAnnotations = met.getDeclaredAnnotations(); int modifiers = met.getModifiers(); LogUtils.i("获取class对象的所有属性:"+name+"----"+declaredAnnotations.length); } } 获取class对象的public属性:NAME----0 获取class对象的所有属性:age----0 获取class对象的所有属性:list----0 获取class对象的所有属性:name----0 获取class对象的所有属性:sex----0 获取class对象的所有属性:NAME----0
- 获取Filed两个方法的区别
- 两者的区别就是
- getDeclaredField() 获取的是 Class 中被 private 修饰的属性。
- getField() 方法获取的是非私有属性,并且 getField() 在当前 Class 获取不到时会向祖先类获取。
//获取所有的属性,但不包括从父类继承下来的属性 public Field[] getDeclaredFields() throws SecurityException {} //获取自身的所有的 public 属性,包括从父类继承下来的。 public Field[] getFields() throws SecurityException {}
- 两者的区别就是
04.获取class对象的方法
- 获取class对象的方法
Method[] methods = class1.getDeclaredMethods();//获取class对象的所有声明方法 Method[] allMethods = class1.getMethods();//获取class对象的所有public方法 包括父类的方法 Method method = class1.getMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的public方法 Method declaredMethod = class1.getDeclaredMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的方法
- 实际案例代码
private void method3() { Student student = new Student(); Class<? extends Student> cl = student.getClass(); //获取class对象的所有public方法 包括父类的方法 Method[] methods = cl.getMethods(); for (int i=0 ; i<methods.length ; i++){ Method met = methods[i]; String name = met.getName(); Annotation[] declaredAnnotations = met.getDeclaredAnnotations(); int modifiers = met.getModifiers(); LogUtils.i("获取class对象的所有public方法,包括父类:"+name+"----"+declaredAnnotations.length); } //获取class对象的所有声明方法 Method[] declaredMethods = cl.getDeclaredMethods(); for (int i=0 ; i<declaredMethods.length ; i++){ Method met = declaredMethods[i]; String name = met.getName(); Annotation[] declaredAnnotations = met.getDeclaredAnnotations(); int modifiers = met.getModifiers(); LogUtils.i("获取class对象的所有声明方法:"+name+"----"+declaredAnnotations.length); } } 获取class对象的所有public方法,包括父类:equals----0 获取class对象的所有public方法,包括父类:getAge----0 获取class对象的所有public方法,包括父类:getClass----0 获取class对象的所有public方法,包括父类:getName----0 获取class对象的所有public方法,包括父类:hashCode----0 获取class对象的所有public方法,包括父类:notify----0 获取class对象的所有public方法,包括父类:notifyAll----0 获取class对象的所有public方法,包括父类:setAge----0 获取class对象的所有public方法,包括父类:setName----0 获取class对象的所有public方法,包括父类:setStudentAge----0 获取class对象的所有public方法,包括父类:toString----0 获取class对象的所有public方法,包括父类:wait----0 获取class对象的所有public方法,包括父类:wait----0 获取class对象的所有public方法,包括父类:wait----0 获取class对象的所有声明方法:getStudent----0 获取class对象的所有声明方法:setList----0 获取class对象的所有声明方法:getAge----0 获取class对象的所有声明方法:getName----0 获取class对象的所有声明方法:setAge----0 获取class对象的所有声明方法:setName----0 获取class对象的所有声明方法:setStudentAge----0
05.获取class对象的构造函数
- 获取class对象的构造函数
Constructor<?>[] allConstructors = class1.getDeclaredConstructors();//获取class对象的所有声明构造函数 Constructor<?>[] publicConstructors = class1.getConstructors();//获取class对象public构造函数 Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//获取指定声明构造函数 Constructor publicConstructor = class1.getConstructor(String.class);//获取指定声明的public构造函数
- 实际案例代码
private void method2() { try { Class<?> cl = Class.forName("net.zhifou.other.ui.activity.Student"); //获取class对象public构造函数 Constructor<?>[] constructors = cl.getConstructors(); for (int i=0 ; i<constructors.length ; i++){ Constructor con = constructors[i]; String name = con.getName(); TypeVariable[] typeParameters = con.getTypeParameters(); Annotation[] declaredAnnotations = con.getDeclaredAnnotations(); LogUtils.i("获取class对象public构造函数:"+name+"----"+typeParameters.length); } //获取class对象的所有声明构造函数 Constructor<?>[] declaredConstructors = cl.getDeclaredConstructors(); for (int i=0 ; i<declaredConstructors.length ; i++){ LogUtils.i("获取class对象的所有声明构造函数:"+declaredConstructors[i].getName()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }
06.获取方法属性
- 其他方法
Annotation[] annotations = (Annotation[]) class1.getAnnotations();//获取class对象的所有注解 Annotation annotation = (Annotation) class1.getAnnotation(Deprecated.class);//获取class对象指定注解 Type genericSuperclass = class1.getGenericSuperclass();//获取class对象的直接超类的 Type Type[] interfaceTypes = class1.getGenericInterfaces();//获取class对象的所有接口的type集合
07.获取对象信息案例
- Class对象代表加载的.class文档,取得Class对象后,就可以取得.class文档中记载的信息,如包、构造函数、数据成员、方法成员等
- 每一种信息都对有对应的类型,如包对应的类型是 java.lang.Package,构造函数对应的类型是 java.lang.reflect.Constructor
- 例如,先来为Student类增添多种类型的不同信息
public final class Student { enum Gender{ male,female } private String name; public int age; protected Gender gender; public Student(String name,int age){ } public Student(String name,int age,Gender gender){ } private Student(){ } public String getName() { return name; } private int getAge(){ return age; } protected Gender getGender(){ return gender; } }
- 再来获取各种信息
public class Main { public static void main(String[] args) { try { Class cl = Class.forName("net.zhifou.demo.Student"); // 取得包对象 Package p = cl.getPackage(); System.out.println("包名:" + p.getName()); // 访问修饰符 int modifier = cl.getModifiers(); System.out.println("类访问修饰符:" + Modifier.toString(modifier)); System.out.println(); //取得构造函数信息 Constructor[] constructors=cl.getConstructors(); for(Constructor constructor:constructors){ System.out.print("访问修饰符:" + Modifier.toString(constructor.getModifiers())); System.out.print(" 构造函数名:"+constructor.getName()); System.out.println(); } System.out.println(); //取得声明的数据成员 Field[] fields = cl.getDeclaredFields(); for (Field field : fields) { System.out.print("访问修饰符:" + Modifier.toString(field.getModifiers())); System.out.print(" 类型:"+field.getType().getName()); System.out.print(" 成员名:"+field.getName()); System.out.println(); } System.out.println(); //取得成员方法息 Method[] methods=cl.getDeclaredMethods(); for(Method method:methods){ System.out.print("访问修饰符:" + Modifier.toString(method.getModifiers())); System.out.print(" 返回值类型:"+method.getReturnType().getName()); System.out.print(" 方法名:"+method.getName()); System.out.println(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
- 运行结果
包名:com.yc.demo 类访问修饰符:public final 访问修饰符:public 构造函数名:net.zhifou.demo.Student 访问修饰符:public 构造函数名:net.zhifou.demo.Student 访问修饰符:private 类型:java.lang.String 成员名:name 访问修饰符:public 类型:int 成员名:age 访问修饰符:protected 类型:com.czy.demo.Student$Gender 成员名:gender 访问修饰符:public 返回值类型:java.lang.String 方法名:getName 访问修饰符:private 返回值类型:int 方法名:getAge 访问修饰符:protected 返回值类型:net.zhifou.demo.Student$Gender 方法名:getGender
赞赏支持
