jmeter源码---HashTree

33 篇文章 3 订阅
31 篇文章 6 订阅

概述

该类用于创建测试对象的树结构。树中的每个元素也是树下一个节点的键。它提供了许多方法来添加对象和分支,以及许多检索的方法。HashTree为了方便的原因实现了映射接口。Map和HashTree的主要区别在于,HashTree将数据组织到一个递归树结构中,并提供了操作该结构的方法。特别是traverse(HashTreeTraverser)方法,它提供了一种方便的方法,通过实现HashTreeTraverser接口来遍历任何哈希树,以便在树上执行一些操作,或者从树中提取信息。

详细参见 http://jmeter.apache.org/api/org/apache/jorphan/collections/HashTree.html

就是一个普通类,源文件中的注释非常详细

实现的接口

实现Serializable接口

该接口仅为标记接口,不包含任何方法定义,表示该类可以序列化

序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计算机平台存在相应的类就可以正常恢复为原来的对象

private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
    ois.defaultReadObject();
}

private void writeObject(ObjectOutputStream oos) throws IOException {
    oos.defaultWriteObject();
}

实现Cloneable接口

在此你需要了解深浅拷贝的概念,我找个帖子自己慢慢看吧~,前辈写的很完全了Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨 啦啦啦啦~

jmx文件

JMeterEngine只依赖HashTree,可以从创建的jmx文件中获知,hashtree贯穿整个jmx文件中

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="3.2" jmeter="3.2 r1790748">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <intProp name="LoopController.loops">-1</intProp>
        </elementProp>

        ……在此省略N行非必要信息……

        <stringProp name="ThreadGroup.delay"></stringProp>
      </ThreadGroup>
      <hashTree>
        <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java Request" enabled="true">
          <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true">
            <collectionProp name="Arguments.arguments"/>
          </elementProp>
          <stringProp name="classname">com.dangdang.com.shardingjdbc.JDBC.JSdbSt.JSdbStInsert</stringProp>
        </JavaSampler>
        <hashTree>
          <hashTree/>
          <hashTree/>
        </hashTree>
      </hashTree>
    </hashTree>
    <WorkBench guiclass="WorkBenchGui" testclass="WorkBench" testname="WorkBench" enabled="true">
      <boolProp name="WorkBench.save">true</boolProp>
    </WorkBench>
    <hashTree/>
  </hashTree>
</jmeterTestPlan>

构造函数

构造函数有多种形式
HashTree(Map<Object, HashTree> _map, Object key):若HashTree不为空则使用HashTree,若key不为空则设为top-level(root)节点,也可能是空。这个构造函数是最为主要的构造函数,它还有几个变形体都是调用它
HashTree():创建空HashTree,实际调用hashTree(null,null)
HashTree(Map<Object, HashTree> _map):允许子类提供Map作为参数
HashTree(Object key):创建HashTree并将key设为top-level节点

HashTree(Collection<?> keys):创建HashTree并且将keys中的所有对象设为top-level节点
HashTree(Object[] keys):创建HashTree并且将keys中的所有对象设为top-level节点

putAll

public void putAll(Map<?, ? extends HashTree> map):参数提供的map必须是HashTree否则会抛出UnsupportedOperationException异常。如果map是HashTree相当于调用add(HashTree)

if (map instanceof HashTree) {
    this.add((HashTree) map);
}

hashTree其他操作

(解释这些函数的作用真的好无聊,也没有太复杂的,快速过一遍~)
containsValue(Object value):是否包含值。实际调用的是map的containsKey,此函数并没有多大用处;
put(Object key, HashTree value):相当于调用add(key,value),参考map的V put(K key, V value);
add和set:添加和设置。存在多个重载函数,提供不同的途径进行添加设置。
getTree:获取树的map,也存在多个重载
createNewTree:从名字可看出,该函数创建一个tree,也存在多个重载函数,供多种访问方式。
getArray:获取当前HashTree节点的所有keys,同样存在多个重载函数,提供多种访问方式
search:在hashtree中搜索指定关键字,返回map对应的hashtree或者null
traverseInto:完成树遍历和执行的递归方法对HashTreeTraverser的回调。使用深度优先遍历hashTree
还有map的一些操作如
hashCode、equals、keySet、size、toString

其他类

private static class TreeSearcher implements HashTreeTraverser{}

该类在search函数中被引用

private static class ConvertToString implements HashTreeTraverser{}

该类在toString中被引用

学习备忘

原文链接 http://blog.csdn.net/yue530tomtom/article/details/78065065

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值