Java的一些反射操作

该博客主要探讨了Java编程中关于反射的使用,包括通过反射获取对象属性值、获取属性名数组、获取所有属性信息以及删除指定字段的方法。还展示了如何获取类的父类以及获取一个类的所有非Object类的父类。此外,文中提供了根据权限筛选结果集数据的示例,演示了如何根据JSON权限设置来清除对象的特定属性。
摘要由CSDN通过智能技术生成
/** 
 * 根据属性名获取属性值 
 * */  
   private Object getFieldValueByName(String fieldName, Object o) {  
       try {    
           String firstLetter = fieldName.substring(0, 1).toUpperCase();    
           String getter = "get" + firstLetter + fieldName.substring(1);    
           Method method = o.getClass().getMethod(getter, new Class[] {});    
           Object value = method.invoke(o, new Object[] {});    
           return value;    
       } catch (Exception e) {    
           log.error(e.getMessage(),e);    
           return null;    
       }    
   }   
     
   /** 
    * 获取属性名数组 
    * */  
   private String[] getFiledName(Object o){  
    Field[] fields=o.getClass().getDeclaredFields();  
        String[] fieldNames=new String[fields.length];  
    for(int i=0;i<fields.length;i++){  
        System.out.println(fields[i].getType());  
        fieldNames[i]=fields[i].getName();  
    }  
    return fieldNames;  
   }  
     
   /** 
    * 获取属性类型(type),属性名(name),属性值(value)的map组成的list 
    * */  
   private List getFiledsInfo(Object o){  
    Field[] fields=o.getClass().getDeclaredFields();  
        String[] fieldNames=new String[fields.length];  
        List list = new ArrayList();  
        Map infoMap=null;  
    for(int i=0;i<fields.length;i++){  
        infoMap = new HashMap();  
        infoMap.put("type", fields[i].getType().toString());  
        infoMap.put("name", fields[i].getName());  
        infoMap.put("value", getFieldValueByName(fields[i].getName(), o));  
        list.add(infoMap);  
    }  
    return list;  
   }  
     
   /** 
    * 获取对象的所有属性值,返回一个对象数组 
    * */  
   public Object[] getFiledValues(Object o){  
    String[] fieldNames=this.getFiledName(o);  
    Object[] value=new Object[fieldNames.length];  
    for(int i=0;i<fieldNames.length;i++){  
        value[i]=this.getFieldValueByName(fieldNames[i], o);  
    }  
    return value;  
   }

获取一个类的父类

 public class MyClass implements Cloneable {
     public static void main(String[] args) {
          Object o = new String();
         Class sup = o.getClass().getSuperclass();
          System.out.println(sup);
  
          o = new Object();
         sup = o.getClass().getSuperclass();
         System.out.println(sup);
         
         //虽然o2是一个接口,但它的父类依然是Object
         Runnable o2 =  new Runnable() {
             public void run() {
             }
         };
                 
         sup = o2.getClass().getSuperclass();
         System.out.println(sup);
 
     }
 }

获取一个类的所有的父类class

 // 获取一个类的所有非object 的class
 public static List<Class<?>> getAllClass(List<Class<?>> classList,Class<?> rootClass){
     Class<?> superclass = rootClass.getSuperclass();
     // 如果没有父类,或者到达Object
     if (rootClass == Object.class){
         return classList;
     }else {
         classList.add(rootClass);
         getAllClass(classList,superclass);
     }
     return classList;
 }

传入一个Object,和字段删除指定字段

/**
 * 传入一个Object删除指定字段
 * @param o
 * @param filedName
 * @return
 */
public static Object clearFiled(Object o, String filedName) {
    Class<?> rootClass = o.getClass();
    try {
        Field declaredField = rootClass.getDeclaredField(filedName);
        // 如果名字对的上就清除,对不上获取的时候就报错了
        // 视情况进行权限开闭
        if (!declaredField.isAccessible())
            declaredField.setAccessible(true);
        // 开启后执行清除
        declaredField.set(o, null);
        // 关闭权限
        if (declaredField.isAccessible())
            declaredField.setAccessible(false);
        // 清除完毕返回清除后的类
        // 如果是根则返回结果,如果是迭代回调则返回上一次出现NoSuchFieldException调用的地方
        return o;
    } catch (NoSuchFieldException e) {
        log.error("属性值不存在,如果父类是object则停止迭代,返回对象");
        if (rootClass.getSuperclass() == Object.class)
            return o;
        // 到这证明他还有父类,向上转型交给下一次迭代,返回后直接走到最后,如果是最后一层迭代直接返回结果
        return clearFiled(BeanUtil.copyProperties(o, rootClass.getSuperclass()), filedName);
    }catch (IllegalAccessException e){
        log.error("非法访问异常",e);
        return o;
    }
}

根据权限json筛选结果集的数据,配合上一条使用

public static void main(String[] args) throws IllegalAccessException, InstantiationException {
    // 权限设置json
    String ac = "{\"aboutUs\":1,\"academics\":1,\"companyId\":1,\"companyType\":1,\"customContents\":1,\"id\":1,\"ourMission\":1,\"ourVision\":1,\"tags\":1,\"自定义大标题1\":1,\"自定义大标题2\":1}";
    ArrayList<BasicDocument> basicDocuments = new ArrayList<>();
    basicDocuments.add(new BasicDocument("企业的文化", "文化"));
    basicDocuments.add(new BasicDocument("企业的政策", "政策"));
    basicDocuments.add(new BasicDocument("联系电话", "电话"));
    // 创建自定义对象,内含基础内容集合,和大标题
    CustomContent customContent = new CustomContent("自定义大标题1");
    customContent.setDocuments(basicDocuments);
    CustomContent customContent2 = new CustomContent("自定义大标题2");
    customContent.setDocuments(basicDocuments);
    // 自定义也是个集合要有好几个
    ArrayList<CustomContent> contents = new ArrayList<>();
    contents.add(customContent);
    contents.add(customContent2);
    // 创建一个学校信息
    EducationOptionalInfo edu = new EducationOptionalInfo();
    edu.setCustomContents(contents);
    edu.setAboutUs(new AboutUs("关于我们啊", "关于我们噻"));
    edu.setCompanyId(17229L);
    edu.setCompanyType(1);
    edu.setId(new ObjectId());
    edu.setOurMission(new OurMission("我们的xxx", "xxxx"));
    // 准备一个结果接收,这里先把引用转递过来,一会直接修改,就算没修改也是原始值
    Object result=edu;
    // 将权限对象转换为map
    HashMap<String,Integer> accMap = JSONObject.parseObject(ac, HashMap.class);
    Set<Map.Entry<String, Integer>> entries = accMap.entrySet();
    // 遍历权限键值对,如果权限为0证明不可展示调用清除属性方法,传入对象和需要清除的字段名
    for (Map.Entry<String, Integer> entry : entries) {
        if (entry.getValue()==0) {
             result = clearFiled(edu, entry.getKey());
        }
    }
    // 打印结果
    System.out.println(result);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值