OgnlContext原始碼分析

2021-07-04 08:46:13 字數 2552 閱讀 9441

1,首先明確ognlcontext是大概乙個什麼樣的資料結構:

public class ognlcontext extends object implements map

能夠看到他實現了map介面,那麼我們就用map的眼光去看待他。

2,分析put方法

剛開始就可以看到:

if (reserved_keys.containskey(key))

2.1.reserved_keys是什麼呢?

追蹤一下:

private static map reserved_keys = new hashmap(11);

那這個hashmap是用來存放什麼的?

下面是重點:

static

public static final string context_context_key = "context";

public static final string root_context_key = "root";

其他的key都是差不多意思的string

總結一下:

reserved_keys就是乙個hashmap,用於存放一些保留的key,正如這個屬性的名字一樣。

這些保留的key就是以上這些string

繼續看put方法:

if (reserved_keys.containskey(key))  else

先把簡單的搞定:如果要放入的鍵值對的key不在保留字範圍內,那就把他儲存在values裡面。

2.2.1values是什麼呢?

private map values = new hashmap(23);

看來也是onglcontext中的乙個hashmap屬性。

2.2.2values什麼時候用的?

/****************== map inte***ce ***************==*/

public int size()

public boolean isempty()

public boolean containskey(object key)

public boolean containsvalue(object value)

看來values才是ognlcontext主要用來儲存資料的地方。

2.3.再看一下當key為保留字的情況下是怎麼儲存的.

if (reserved_keys.containskey(key))  else  else  else  else  else  else  else  else  else }}

}}}}

}}

}

**有點長,但是套路是一樣的,就拿前面兩種情況來說:

1.判斷key是否為this_context_key,即"this",如果是,則執行setcurrentobject(value);

關於這個方法:

public void setcurrentobject(object value)

原來是在ognlcontext中有乙個屬性叫做currentobject,意思是當前的物件,存的時候他的key為保留的"this"。

2.判斷key是否為root_context_key,即"root",如果是,則執行setroot(value);

public void setroot(object value)

同樣的意思

總結:原來在ognlcontext有很多固定的屬性(就是上面說的「保留字」),除了這些固定的屬性,還有乙個叫做values的hashmap,

values這個hashmap以及ognlcontext中屬性一起實現了map結構。

3.分析get方法:

public object get(object key)

else else else else else else else else else }}

}}}}

}}

} else

return result;

}

有了put的基礎,這個看一眼就知道是什麼意思了,怎麼put進去的就怎麼取出來。

4.其他的方法:

4.1.clear

public void clear()

看了這個方法,也證明了之前得出的結論,這個map是由values以及他的一些屬性共同維護的。

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

AbstractListView原始碼分析3

normal list that does not indicate choices public static final int choice mode none 0 the list allows up to one choice public static final int choice ...

Android AsyncTask原始碼分析

android中只能在主線程中進行ui操作,如果是其它子執行緒,需要借助非同步訊息處理機制handler。除此之外,還有個非常方便的asynctask類,這個類內部封裝了handler和執行緒池。本文先簡要介紹asynctask的用法,然後分析具體實現。asynctask是乙個抽象類,我們需要建立子...