Java反射小记(基本使用方式、泛型、为Integer类型属性赋值)

private static <T> void reflect_test(Object o, Class<T> oClass) throws Exception {
        //将o转换为oClass类型
        T cast = oClass.cast(o);
        //获取类名
        String typeName = cast.getClass().getTypeName();
        //通过反射加载类数据
        Class<?> aClass = Class.forName(typeName);

        //获取类中所有方法
        Method[] methods = aClass.getMethods();
        //获取类中指定名称的方法
        Method classMethod = aClass.getMethod("指定方法名称");
        //获取类中指定名称,参数类型的方法
        Method aClassMethod = aClass.getMethod("指定方法名称", Integer.class);

        //获得某个类的所有的公共(public)的字段,包括父类中的字段。
        Field[] fields = aClass.getFields();
        //获得某个类的指定名称的公共(public)的字段,包括父类中的字段。
        aClass.getField("指定属性名称");

        //获取类中public、private和proteced修饰的字段,但是不包括父类的声明的字段
        Field[] declaredFields = aClass.getDeclaredFields();
        //获取类中指定名称的被public、private和proteced修饰的字段,但是不包括父类的声明的字段
        Field declaredField = aClass.getDeclaredField("指定属性名称");

        //获取类中全部被public、private和proteced修饰的字段,包含父类的字段
        List<Field> fieldList = new ArrayList<>();
        while(aClass != null){
          fieldList.addAll(Arrays.asList(aClass.getDeclaredFields()));
          //递归
          aClass = aClass.getSuperclass();
        }

        //为属性赋值
        for(Field field : fieldList){
          if(("xxx").equals(field.getName())){
            //如果此属性为非public属性的情况时,需要设置属性可达,否则会抛出IllegalAccessException异常
            field.setAccessible(true);
            //赋值
            field.set(field.getName(),"属性值");
            //获取属性值
            field.get(field.getName());
          }
        }


        //赋值的时候如果为Integer赋值会出现异常,所以我们可以通过调用set方法的形式为Integer等类 
        //型的对象进行赋值
        //例如第一个方法(methods[0])为Integer类型的属性的set方法,将其设置为100
        methods[0].invoke(aClass,100);
    }

猜你喜欢

转载自blog.csdn.net/Peacock__/article/details/88825151