Play OpenJDK: 鍏佽浣犵殑鍖呭悕浠?java."寮澶?/span>
鏈枃鏄疨lay OpenJDK鐨勭浜岀瘒錛屼粙緇嶄簡濡備綍紿佺牬JDK涓嶅厑璁歌嚜瀹氫箟鐨勫寘鍚嶄互"java."寮澶磋繖涓闄愬埗銆傝繖涓鎶宸у浜庡熀浜庡凡鏈夌殑JDK鍚慾ava.*涓坊鍔犳柊綾昏繕鏄湁鎵甯姪鐨勩?2015.11.02鏈鍚庢洿鏂?
鏃犺鏄粡楠屼赴瀵岀殑Java紼嬪簭鍛橈紝榪樻槸Java鐨勫垵瀛﹁咃紝鎬諱細(xì)鏈変竴浜涗漢鎴栨湁鎰忔垨鏃犳剰鍦板垱寤轟竴涓寘鍚嶄負(fù)"java"鐨勭被銆備絾鍑轟簬瀹夊叏鏂歸潰鐨勮冭檻錛孞DK涓嶅厑璁稿簲鐢ㄧ▼搴忕被鐨勫寘鍚嶄互"java"寮澶達(dá)紝鍗充笉鍏佽java錛宩ava.foo榪欐牱鐨勫寘鍚嶃備絾javax錛宩avaex榪欐牱鐨勫寘鍚嶆槸鍏佽鐨勩?br />
1. 渚嬪瓙
姣斿錛屼互OpenJDK 8涓哄熀紜錛岃噯閫犺繖鏍蜂竴涓緥瀛愩傜瑪鑰呮兂鍚慜penJDK璐$尞涓涓悓姝ョ殑HashMap錛屽嵆綾籗ynchronizedHashMap錛岃岃綾葷殑鍖呭悕灝變負(fù)java.util銆係ynchronizedHashMap鏄疕ashMap鐨勫悓姝ヤ唬鐞嗭紝鐢變簬榪欎袱涓被鏄湪鍚屼竴鍖呭唴錛孲ynchronizedHashMap涓嶄粎鍙互璁塊棶HashMap鐨刾ublic鏂規(guī)硶涓庡彉閲忥紝榪樺彲浠ヨ闂瓾ashMap鐨刾rotected鍜宒efault鏂規(guī)硶涓庡彉閲忋係ynchronizedHashMap鐪嬭搗鏉ュ彲鑳藉儚涓嬮潰榪欐牱錛?br />package java.util;
public class SynchronizedHashMap<K, V> {
private HashMap<K, V> hashMap = null;
public SynchronizedHashMap(HashMap<K, V> hashMap) {
this.hashMap = hashMap;
}
public SynchronizedHashMap() {
this(new HashMap<>());
}
public synchronized V put(K key, V value) {
return hashMap.put(key, value);
}
public synchronized V get(K key) {
return hashMap.get(key);
}
public synchronized V remove(K key) {
return hashMap.remove(key);
}
public synchronized int size() {
return hashMap.size; // 鐩存帴璋冪敤HashMap.size鍙橀噺錛岃岄潪HashMap.size()鏂規(guī)硶
}
}
2. ClassLoader鐨勯檺鍒?/span>
浣跨敤javac鍘葷紪璇戞簮鏂囦歡SynchronizedHashMap.java騫舵病鏈夐棶棰橈紝浣嗗湪浣跨敤緙栬瘧鍚庣殑SynchronizedHashMap.class鏃訛紝JDK鐨凜lassLoader鍒欎細(xì)鎷掔粷鍔犺澆java.util.SynchronizedHashMap銆?br />璁炬兂鏈夊涓嬬殑搴旂敤紼嬪簭錛?br />import java.util.SynchronizedHashMap;
public class SyncMapTest {
public static void main(String[] args) {
SynchronizedHashMap<String, String> syncMap = new SynchronizedHashMap<>();
syncMap.put("Key", "Value");
System.out.println(syncMap.get("Key"));
}
}
浣跨敤java鍛戒護(hù)鍘昏繍琛岃搴旂敤鏃訛紝浼?xì)鎶ュ涓嬮敊璇Q?br />Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:659)
at java.lang.ClassLoader.defineClass(ClassLoader.java:758)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at SyncMapTest.main(SyncMapTest.java:6)
鏂規(guī)硶ClassLoader.preDefineClass()鐨勬簮浠g爜濡備笅錛?br />private ProtectionDomain preDefineClass(String name,
ProtectionDomain pd)
{
if (!checkName(name))
throw new NoClassDefFoundError("IllegalName: " + name);
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException
("Prohibited package name: " +
name.substring(0, name.lastIndexOf('.')));
}
if (pd == null) {
pd = defaultDomain;
}
if (name != null) checkCerts(name, pd.getCodeSource());
return pd;
}
寰堟竻妤氬湴錛岃鏂規(guī)硶浼?xì)鍏垕個(gè)鏌ュ緟鍔犺澆鐨勭被鍏ㄥ悕(鍗沖寘鍚?綾誨悕)鏄惁浠?java."寮澶達(dá)紝濡傛槸錛屽垯鎶涘嚭SecurityException銆傞偅涔堝彲浠ュ皾璇曚慨鏀硅鏂規(guī)硶鐨勬簮浠g爜錛屼互紿佺牬榪欎竴闄愬埗銆?br />浠嶫DK涓殑src.zip涓嬁鍑簀ava/lang/ClassLoader.java鏂囦歡錛屼慨鏀瑰叾涓殑preDefineClass鏂規(guī)硶浠ュ幓闄ょ浉鍏抽檺鍒躲傞噸鏂扮紪璇慍lassLoader.java錛屽皢鐢熸垚鐨凜lassLoader.class錛孋lassLoader$1.class錛孋lassLoader$2.class錛孋lassLoader$3.class錛孋lassLoader$NativeLibrary.class錛孋lassLoader$ParallelLoaders.class鍜孲ystemClassLoaderAction.class鍘繪浛鎹DK/jre/lib/rt.jar涓搴旂殑綾匯?br />鍐嶆榪愯SyncMapTest錛屽嵈浠嶇劧浼?xì)鎶涘嚭鐩稿悓鐨凷ecurityException錛屽涓嬫墍紺猴細(xì)
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at SyncMapTest.main(SyncMapTest.java:6)
姝ゆ椂鏄敱鏂規(guī)硶ClassLoader.defineClass1()鎶涘嚭鐨凷ecurityException銆備絾榪欐槸涓涓猲ative鏂規(guī)硶錛岄偅涔堜粎閫氳繃淇敼Java浠g爜鏄棤娉曡В鍐寵繖涓棶棰樼殑(JDK鐪熸槸灞傚眰璁鵑槻鍟?銆傚師鏉ュ湪Hotspot鐨凜++婧愭枃浠秇otspot/src/share/vm/classfile/systemDictionary.cpp涓湁濡備笅璇彞錛?br />const char* pkg = "java/";
if (!HAS_PENDING_EXCEPTION &&
!class_loader.is_null() &&
parsed_name != NULL &&
!strncmp((const char*)parsed_name->bytes(), pkg, strlen(pkg))) {
// It is illegal to define classes in the "java." package from
// JVM_DefineClass or jni_DefineClass unless you're the bootclassloader
ResourceMark rm(THREAD);
char* name = parsed_name->as_C_string();
char* index = strrchr(name, '/');
*index = '\0'; // chop to just the package name
while ((index = strchr(name, '/')) != NULL) {
*index = '.'; // replace '/' with '.' in package name
}
const char* fmt = "Prohibited package name: %s";
size_t len = strlen(fmt) + strlen(name);
char* message = NEW_RESOURCE_ARRAY(char, len);
jio_snprintf(message, len, fmt, name);
Exceptions::_throw_msg(THREAD_AND_LOCATION,
vmSymbols::java_lang_SecurityException(), message);
}
淇敼璇ユ枃浠朵互鍘婚櫎鎺夌浉鍏抽檺鍒訛紝騫舵寜鐓ф湰緋誨垪鐨?a href="http://www.tkk7.com/jiangshachina/archive/2015/10/30/427994.html">絎竴綃囨枃绔?/a>涓粙緇嶇殑鏂規(guī)硶鍘婚噸鏂版瀯寤轟竴涓狾penJDK銆傞偅涔堬紝榪欎釜鏂扮殑JDK灝嗕笉浼?xì)鍐嶅鍖呭悕鏈変恢M綍闄愬埗浜嗐?br />
3. 瑕嗙洊Java鏍稿績API錛?/strong>
寮鍙戣呬滑鍦ㄤ嬌鐢ㄤ富嫻両DE鏃朵細(xì)鍙戠幇錛屽鏋滃伐紼嬫湁澶氫釜jar鏂囦歡鎴栨簮鏂囦歡鐩綍涓寘鍚浉鍚岀殑綾伙紝榪欎簺IDE浼?xì)鏍规嵁鐢ㄦ堜h寚瀹氱殑浼樺厛綰ч『搴忔潵鍔犺澆榪欎簺綾匯傛瘮濡傦紝鍦‥clipse涓紝鍙抽敭鐐瑰嚮鏌愪釜Java宸ョ▼-->灞炴?->Java Build Path-->Order and Export錛屽湪榪欓噷璋冩暣鍚勪釜綾誨簱鎴栨簮鏂囦歡鐩綍鐨勪綅緗紝鍗沖彲鎸囧畾鍔犺澆綾葷殑浼樺厛綰с?br />褰撳紑鍙戣呭湪浣跨敤鏌愪釜寮婧愮被搴?jar鏂囦歡)鏃訛紝鎯沖鍏朵腑鏌愪釜綾昏繘琛屼慨鏀癸紝閭d箞灝卞彲浠ュ皢璇ョ被鐨勬簮浠g爜澶嶅埗鍑烘潵錛屽茍鍦↗ava宸ョ▼涓垱寤轟竴涓悓鍚嶇被錛岀劧鍚庢寚瀹欵clipse浼樺厛鍔犳伅鑷繁鍒涘緩鐨勭被銆傚嵆錛屽湪緙栬瘧鏃朵笌榪愯鏃剁敤鑷繁鍒涘緩鐨勭被鍘昏鐩栫被搴撲腑鐨勫悓鍚嶇被銆傞偅涔堬紝鏄惁鍙互濡傛硶鐐埗鍘昏鐩朖ava鏍稿績API涓殑綾誨憿錛?br />鑰冭檻鍘昏鐩栫被java.util.HashMap錛屽彧鏄畝鍗曞湪瀹冪殑put()鏂規(guī)硶娣誨姞涓鏉℃墦鍗拌銆傞偅涔堝氨闇瑕佸皢src.zip涓殑java/util/HashMap.java澶嶅埗鍑烘潵錛屽茍鍦ㄥ綋鍓岼ava宸ョ▼涓垱寤轟竴涓悓鍚嶇被java.util.HashMap錛屽茍淇敼put()鏂規(guī)硶錛屽涓嬫墍紺猴細(xì)
package java.util;
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
.
public V put(K key, V value) {
System.out.printf("put - key=%s, value=%s%n", key, value);
return putVal(hash(key), key, value, false, true);
}

} 姝ゆ椂錛屽湪Eclipse鐜涓紝SynchronizedHashMap浣跨敤鐨刯ava.util.HashMap琚涓烘槸涓婅堪鏂板垱寤虹殑HashMap綾匯傞偅涔堣繍琛屽簲鐢ㄧ▼搴廠yncMapTest鍚庣殑鏈熸湜杈撳嚭搴旇濡備笅鎵紺猴細(xì)
put - key=Key, value=Value
Value
浣嗚繍琛孲yncMapTest鍚庣殑瀹為檯杈撳嚭鍗翠負(fù)濡備笅錛?br />Value
鐪嬭搗鏉ワ紝鏂板垱寤虹殑java.util.HashMap騫舵病鏈夎浣跨敤涓娿傝繖鏄負(fù)浠涔堝憿錛熻兘澶?鎯沖儚"鍒扮殑鍘熷洜榪樻槸綾誨姞杞藉櫒銆傚叧浜嶫ava綾誨姞杞藉櫒鐨勮璁鴻秴鍑轟簡鏈枃鐨勮寖鍥達(dá)紝鑰屼笖鍏充簬璇ヤ富棰樼殑鏂囩珷宸叉槸姹楃墰鍏呮爧錛屼絾鏈枃浠嶄細(xì)綆榪板叾瑕佺偣銆?br />Java綾誨姞杞藉櫒鐢變笅鑷充笂鍒嗕負(fù)涓変釜灞傛錛氬紩瀵肩被鍔犺澆鍣?Bootstrap Class Loader)錛屾墿灞曠被鍔犺澆鍣?Extension Class Loader)鍜屽簲鐢ㄧ▼搴忕被鍔犺澆鍣?Application Class Loader)銆傚叾涓紩瀵肩被鍔犺澆鍣ㄧ敤浜庡姞杞絩t.jar榪欐牱鐨勬牳蹇冪被搴撱傚茍涓斿紩瀵肩被鍔犺澆鍣ㄤ負(fù)鎵╁睍綾誨姞杞藉櫒鐨勭埗鍔犺澆鍣紝鑰屾墿灞曠被鍔犺澆鍣ㄥ張涓哄簲鐢ㄧ▼搴忕被鍔犺澆鍣ㄧ殑鐖跺姞杞藉櫒銆傚悓鏃禞VM鍦ㄥ姞杞界被鏃跺疄琛屽鎵樻ā寮忋傚嵆錛屽綋鍓嶇被鍔犺澆鍣ㄥ湪鍔犺澆綾繪椂錛屼細(xì)棣栧厛濮旀墭鑷繁鐨勭埗鍔犺澆鍣ㄥ幓榪涜鍔犺澆銆傚鏋滅埗鍔犺澆鍣ㄥ凡緇忓姞杞戒簡鏌愪釜綾伙紝閭d箞瀛愬姞杞藉櫒灝嗕笉浼?xì)鍐崑啤鍔犺浇銆?br />鐢變笂鍙煡錛屽綋搴旂敤紼嬪簭璇曞浘鍔犺澆java.util.Map鏃訛紝瀹冧細(xì)棣栧厛閫愮駭鍚戜笂濮旀墭鐖跺姞杞藉櫒鍘誨姞杞借綾伙紝鐩村埌寮曞綾誨姞杞藉櫒鍔犺澆鍒皉t.jar涓殑java.util.HashMap銆傜敱浜庤綾誨凡緇忚鍔犺澆浜嗭紝鎴戜滑鑷繁鍒涘緩鐨刯ava.util.HashMap灝變笉浼?xì)琚噸澶嶅姞铦层?br />浣跨敤java鍛戒護(hù)榪愯SyncMapTest紼嬪簭鏃跺姞涓奦M鍙傛暟-verbose:class錛屼細(xì)鍦ㄧ獥鍙d腑鎵撳嵃鍑哄艦寮忓涓嬬殑璇彞錛?br />[Opened /home/ubuntu/jdk1.8.0_custom/jre/lib/rt.jar]
[Loaded java.lang.Object from /home/ubuntu/jdk1.8.0_custom/jre/lib/rt.jar]

[Loaded java.util.HashMap from /home/ubuntu/jdk1.8.0_custom/jre/lib/rt.jar]
[Loaded java.util.HashMap$Node from /home/ubuntu/jdk1.8.0_custom/jre/lib/rt.jar]

[Loaded java.util.SynchronizedHashMap from file:/home/ubuntu/projects/test/classes/]
Value
[Loaded java.lang.Shutdown from /home/ubuntu/jdk1.8.0_custom/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /home/ubuntu/jdk1.8.0_custom/jre/lib/rt.jar] 浠庝腑鍙互鐪嬪嚭錛岀被java.util.HashMap紜疄鏄粠rt.jar涓姞杞藉埌鐨勩備絾鐞嗚涓婏紝鍙互閫氳繃鑷畾涔夌被鍔犺澆鍣ㄥ幓鎵撶牬濮旀墭妯″紡錛岀劧鑰岃繖灝辨槸鍙︿竴涓瘽棰樹簡銆?/div> 
]]>