zoukankan      html  css  js  c++  java
  • Java反射中getDeclaredField和getField的区别

    getDeclaredField是可以获取一个类的所有字段. 
    getField只能获取类的public 字段. 

    public Field getDeclaredField(String name)  
           throws NoSuchFieldException, SecurityException {  
           checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());  
           Field field = searchFields(privateGetDeclaredFields(false), name);  
           if (field == null) {  
               throw new NoSuchFieldException(name);  
           }  
           return field;  
       }  
      
      
    rivate Field getField0(String name) throws NoSuchFieldException {  
           Field res = null;  
           // Search declared public fields  
           if ((res = searchFields(privateGetDeclaredFields(true), name)) != null) {  
               return res;
        }  
    

      

    getField其实调用的是getField0. 
    他们最后都调用了searchFields. 
    不过getDeclaredField传入的是privateGetDeclaredFields(false), 
    getField传入的是privateGetDeclaredFields(true);

    private Field[] privateGetDeclaredFields(boolean publicOnly) {  
           checkInitted();  
           Field[] res = null;  
           if (useCaches) {  
               clearCachesOnClassRedefinition();  
               if (publicOnly) {  
                   if (declaredPublicFields != null) {  
                       res = (Field[]) declaredPublicFields.get();  
                   }  
               } else {  
                   if (declaredFields != null) {  
                       res = (Field[]) declaredFields.get();  
                   }  
               } 
    

      

    可以看到传入条件为true的时候使用的是declaredPublicFields,意思是public字段 
    为false的时候使用的是declaredFields.

     当然declaredFields和declaredPublicFields最终的来源是:

    private native Field[] getDeclaredFields0(boolean publicOnly);  
    

      

  • 相关阅读:
    hdu 1715
    hdu 1370
    hdu 2370
    hdu 1393
    hdu 1564
    hdu 1720
    hdu 1342
    SQL技巧(sp_procedure_params_rowset,SQL中设置数据值为null)
    Control ‘dg’ of type 'GridView' must be placed inside a form tag with runat=server
    GridView事件中获取rowIndex值
  • 原文地址:https://www.cnblogs.com/EdinburghOne/p/9292859.html
Copyright © 2011-2022 走看看