通过反射获取对象信息

阅读: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


赞赏支持


精彩留言

发表评论