`

AttributeSource内容简答分析

 
阅读更多

一、AttributeImpl通过AttributeSource得到自己的属性和对应的值

//静态的final方法得到一个WeakIdentityMap<k,v> k=impl v=list<attribute>
private static final WeakIdentityMap<Class<? extends AttributeImpl>,LinkedList<WeakReference<Class<? extends Attribute>>>> knownImplClasses =
    WeakIdentityMap.newConcurrentHashMap(false);
  //得到Impl继承的接口list<attribute>
  static LinkedList<WeakReference<Class<? extends Attribute>>> getAttributeInterfaces(final Class<? extends AttributeImpl> clazz) {
//首先从WeakIdentityMap中得到
//如果是空值自己主动处理
//但还为什么明明第一次就是空值,是为了防止多次加载吗?
    LinkedList<WeakReference<Class<? extends Attribute>>> foundInterfaces = knownImplClasses.get(clazz);
    if (foundInterfaces == null) {
    	System.out.println("时空的自己加载的");
   //先实例化一个
      foundInterfaces = new LinkedList<WeakReference<Class<? extends Attribute>>>();
      //得到impl的所有接口遍历
   //如果接口满足不是Attribute 但是又是Attribute的子接口list就添加进去
   //然后impl=impl的一个超类,接着重复遍历
   //最后还是添加到了WeakIdentityMap中
      Class<?> actClazz = clazz;
      do {
        for (Class<?> curInterface : actClazz.getInterfaces()) {
          if (curInterface != Attribute.class && Attribute.class.isAssignableFrom(curInterface)) {
            foundInterfaces.add(new WeakReference<Class<? extends Attribute>>(curInterface.asSubclass(Attribute.class)));
          }
        }
        actClazz = actClazz.getSuperclass();
      } while (actClazz != null);
      knownImplClasses.put(clazz, foundInterfaces);
    }
    return foundInterfaces;
  } 

 二、AttributeSource的工厂是做什么的?

//Attribute的工厂 只有一个方法通过attriubte创建一个Impl的实例
//Attribute工厂的作用是什么? 通过Attribute得到AttributeImpl
  public static abstract class AttributeFactory {
//工厂的抽象方法 放回一个AttributeImpl参数是Attribute
    public abstract AttributeImpl createAttributeInstance(Class<? extends Attribute> attClass);
    //默认里面实现了一个工厂 我把他放到下面了单独看下
    public static final AttributeFactory DEFAULT_ATTRIBUTE_FACTORY = new DefaultAttributeFactory();
     }
//===============================================
 //默认工厂的实现
    private static final class DefaultAttributeFactory extends AttributeFactory {
//此处的map
      private static final WeakIdentityMap<Class<? extends Attribute>, WeakReference<Class<? extends AttributeImpl>>> attClassImplMap =
        WeakIdentityMap.newConcurrentHashMap(false);
//空的构造方法
      DefaultAttributeFactory() {} 
//要实现的方法
      @Override
      public AttributeImpl createAttributeInstance(Class<? extends Attribute> attClass) {
        try {
      //通过这个方法返回它的impl实例
          return getClassForInterface(attClass).newInstance();
        } catch (InstantiationException e) {
          throw new IllegalArgumentException("Could not instantiate implementing class for " + attClass.getName());
        } catch (IllegalAccessException e) {
          throw new IllegalArgumentException("Could not instantiate implementing class for " + attClass.getName());
        }
      }
      
//如何通过attribute得到impl
      private static Class<? extends AttributeImpl> getClassForInterface(Class<? extends Attribute> attClass) {
//attClassImplMap是上面从WeakIdentityMap实例化的一个
        final WeakReference<Class<? extends AttributeImpl>> ref = attClassImplMap.get(attClass);
        Class<? extends AttributeImpl> clazz = (ref == null) ? null : ref.get();
//如果是空值 自行得到
        if (clazz == null) {
          // we have the slight chance that another thread may do the same, but who cares?
          try {
            attClassImplMap.put(attClass,
              new WeakReference<Class<? extends AttributeImpl>>(
//试图得到impl
                clazz = Class.forName(attClass.getName() + "Impl", true, attClass.getClassLoader())
                .asSubclass(AttributeImpl.class)
              )
            );
          } catch (ClassNotFoundException e) {
            throw new IllegalArgumentException("Could not find implementing class for " + attClass.getName());
          }
        }
        return clazz;
      }
    }

 

 

三、Attribute的四个个内部属性

 //AttributeSource的四个属性
//Attribute----------Impl
private final Map<Class<? extends Attribute>, AttributeImpl> attributes;

//Impl---------------impl
 private final Map<Class<? extends AttributeImpl>, AttributeImpl> attributeImpls;

//???
 private final State[] currentState;

//内部的impl工厂
 private final AttributeFactory factory;

 

四、AttributeSource的AddAttriubte和AddAttributeImp两个方法

 public final void addAttributeImpl(final AttributeImpl att) {
    final Class<? extends AttributeImpl> clazz = att.getClass();
//属性包含直接返回了
    if (attributeImpls.containsKey(clazz)){          
    	return;
    }
//得到所有接口
    final LinkedList<WeakReference<Class<? extends Attribute>>> foundInterfaces =
      getAttributeInterfaces(clazz);
    
    // add all interfaces of this AttributeImpl to the maps
//遍历接口
    for (WeakReference<Class<? extends Attribute>> curInterfaceRef : foundInterfaces) {
//这个get是WeakReference的
      final Class<? extends Attribute> curInterface = curInterfaceRef.get();
      assert (curInterface != null) :
        "We have a strong reference on the class holding the interfaces, so they should never get evicted";
      // Attribute is a superclass of this interface
      if (!attributes.containsKey(curInterface)) {
        // invalidate state to force recomputation in captureState()
//填充属性了
        this.currentState[0] = null;
        attributes.put(curInterface, att);
        attributeImpls.put(clazz, att);
      }
    }
  }
  
//添加Attribute还是最终添加的是AttributeImpl因为impl是实现
  public final <A extends Attribute> A addAttribute(Class<A> attClass) {
                                       //attributes是source的一个属性
    AttributeImpl attImpl = attributes.get(attClass);
    if (attImpl == null) {
      if (!(attClass.isInterface() && Attribute.class.isAssignableFrom(attClass))) {
        throw new IllegalArgumentException(
          "addAttribute() only accepts an interface that extends Attribute, but " +
          attClass.getName() + " does not fulfil this contract."
        );
      }
    //通过工厂得到impl
      addAttributeImpl(attImpl = this.factory.createAttributeInstance(attClass));
    }
    return attClass.cast(attImpl);
  }

 五、State 是干嘛的?

public static final class State implements Cloneable {
    AttributeImpl attribute;
    State next;
    
    @Override
    public State clone() {
      State clone = new State();
      clone.attribute = attribute.clone();
      
      if (next != null) {
        clone.next = next.clone();
      }
      return clone;
    }
  }
//========================================
 public final String reflectAsString(final boolean prependAttClass) {
    final StringBuilder buffer = new StringBuilder();
    reflectWith(new AttributeReflector() {
      @Override
      public void reflect(Class<? extends Attribute> attClass, String key, Object value) {
        if (buffer.length() > 0) {
          buffer.append(',');
        }
        if (prependAttClass) {
          buffer.append(attClass.getName()).append('#');
        }
        buffer.append(key).append('=').append((value == null) ? "null" : value);
      }
    });
    return buffer.toString();
  }
  
  
  public final void reflectWith(AttributeReflector reflector) {
    for (State state = getCurrentState(); state != null; state = state.next) {
      state.attribute.reflectWith(reflector);
    }
  }

 

分享到:
评论

相关推荐

    自整理财务分析简答题.doc

    - 内容局限性:报表可能由于制度、保密或标准原因无法提供详细分析数据,不能反映未来事件,且只能反映历史情况,无法体现当前状态。 - 时间局限性:报表的编制时间与实际状况可能存在差距,可能导致信息滞后。 4...

    小学教育知识与能力第三章练习题(单选、简答、材料分析).doc

    小学教育知识与能力第三章练习题(单选、简答、材料分析).doc

    2020—2021学年下学期电子信息工程专业《电子技术基础》期末考试题试卷(简答分析题G).pdf

    《电子技术基础》期末考...以上是对《电子技术基础》期末考试题中部分简答和分析题目的详解,涵盖了电子电路中的基础理论和实际应用。这些知识点是电子信息工程专业学生必备的基础,也是深入学习高级电子技术的基础。

    ACCP5.0课后 简答题

    这个压缩包文件包含了该课程中的课后简答题,可能涵盖了编程基础、数据库管理、网络技术、软件工程等多个方面的内容。下面,我们将根据这些简答题的文件名,对可能涉及的知识点进行详细阐述。 1. **简答1**: 这个...

    分析化学简答题试题库.doc

    这份文档《分析化学简答题试题库.doc》包含了一系列与分析化学相关的简答题,涵盖了分析化学的基础概念、误差分析和数据处理等核心知识点。 1. 分析化学的分类方法: 分析化学可以根据不同的标准分为多个类别。...

    电力系统分析简答题.doc

    电力系统分析简答题是电力系统分析的基础知识,涵盖了电力系统的基本概念、电力系统元件模型及参数计算、简单电力网的潮流计算等内容。下面是电力系统分析简答题的知识点总结: 一、电力系统的基本概念 * 电力系统...

    化工原理简答题答案.doc

    化工原理简答题答案

    金融市场简答题和案例分析.pdf

    根据所提供的文件信息,可以推断这份文件与金融市场相关,包含了简答题和案例分析,并且提及了技术相关内容。文件中出现的乱码和数字串可能是扫描错误或识别问题。尽管文档内容无法直接解读,但根据文件名和描述,...

    口腔修复学简答题及答案.pdf

    由于所提供的【部分内容】并不包含实际的文字信息,所以无法针对具体的修复案例、技术细节和答案进行深入分析。如果需要针对具体的修复技术或案例进行详细解析,建议提供具体的文字内容以便生成更精确的知识点。

    名词解释简答题案列分析.pdf

    名词解释简答题案列分析.pdf

    工作分析简答论述.doc

    工作分析简答论述.doc

    食品分析简答题.doc

    食品分析简答题.doc

    python简答题复习题库1

    "Python 简答题复习题库 1" 本资源摘要信息涵盖了 Python 语言的多个方面,包括内存管理、运算符、模块导入、脚本程序、列表操作、逻辑运算符、字符串驻留机制、异常处理、pdb 调试模块等。 1. 简单解释 Python ...

    报表分析简答已排序.doc

    【报表分析简答已排序.doc】的文档涵盖了多个财务分析的关键知识点,主要涉及以下几个方面: 1. **营运资源范围**:保持适当的营运资源意味着企业应根据自身业务需求和行业特性来合理配置流动资产和流动负债,确保...

    考试系统中简答题自动判分的实现

    实现简答题的自动判分主要依赖于自然语言处理(NLP)技术,尤其是文本匹配和语义分析等方面的技术。 1. **文本匹配**:这是最基础的技术之一,主要用于判断学生答案中的关键词或短语是否与标准答案相匹配。这一步骤...

    中科院陈玉福计算机算法设计与分析期末简答题答案

    根据给定文件的信息,我们可以提炼出以下相关的IT知识点: ### 1. 贪心算法与动态规划算法 ...以上内容详细解释了给定文件标题和描述中的核心知识点,包括算法设计与分析的基本概念、方法以及具体应用场景。

    自动控制原理简答题.doc

    自动控制原理是自动控制系统的基础理论,它涉及到控制系统的设计、分析和优化。自动控制原理包括系统的数学模型、传递函数、频率特性、状态空间模型等方面的知识。下面是自动控制原理简答题的知识点总结: 一、系统...

    保险基础知识历年简答、分析案例及答案.doc

    保险基础知识历年简答、分析案例及答案.doc

    算法设计与分析期末复习笔记+期末习题解答

    1. 算法设计与分析:这部分内容涉及到算法基础操作的时间复杂度,渐近分析,包括对函数进行增长趋势判断和最差情况输入的极限求解。还包括原地算法的定义,即额外辅助空间需求为常量级的算法。 2. 分治法:提到算法...

Global site tag (gtag.js) - Google Analytics