यदि आपका प्रश्न ऑब्जेक्ट्स के लिए क्लासलोडर पदानुक्रम को चित्रित या विज़ुअलाइज़ करना है, तो आप कोड में प्रत्येक कक्षा क्लासलोडर को चल सकते हैं। आपने कहा है कि आप ग्रूवी उपयोग कर रहे हैं, तो जैसे एक उदाहरण दिखेगा:
def showObjectClassLoaderHierarchy(Object obj) {
def classLoader = showClassLoaderHierarchy(obj.getClass().getClassLoader());
showClassLoaderHierarchy(classLoader);
}
def showClassLoaderHierarchy(ClassLoader loader) {
if (loader != null) {
println "Classloader: " + loader.hashCode();
while (loader.getParent() != null) {
loader = loader.getParent();
println " Child of: " + loader.hashCode();
}
}
}
मैं तुम्हें मिलेगा लगता है, अपने कोड में, दो डाटा वस्तुओं वास्तव में एक ही classloader, जिसके कारण वे से लोड नहीं कर रहे हैं विभिन्न स्थिर चर।
मैं एक साथ एक नमूना है कि है
- मुख्य डाल एक स्थिर स्ट्रिंग (माता-पिता classloader से भी भरा हुआ है)
- LoadA, जो DataObj की एक प्रति को दर्शाता है के साथ (मूल classloader से लोड)
- DataObj (बच्चे classloader एक से लोड)
- LoadB, जो DataObj की एक प्रति को दर्शाता है (बच्चे classloader बी से भरी हुई)
मुझे लगता है कि लोडए और लोडबी के पास अलग-अलग क्लासलोडर हैं, जबकि डेटाओबीजे और स्थिर चर एक सामान्य क्लासलोडर से आते हैं।
पूर्ण कोड पर: https://github.com/lucasmcgregor/groovy_classloader_test
ग्रूवी में मुख्य वस्तु:
import java.lang.ClassLoader;
import java.net.URLClassLoader;
import java.net.URL;
def showObjectClassLoaderHierarchy(Object obj) {
def classLoader = showClassLoaderHierarchy(obj.getClass().getClassLoader());
showClassLoaderHierarchy(classLoader);
}
def showClassLoaderHierarchy(ClassLoader loader) {
if (loader != null) {
println "Classloader: " + loader.hashCode();
while (loader.getParent() != null) {
loader = loader.getParent();
println " Child of: " + loader.hashCode();
}
}
}
println "Setting up child classLoaders A and B...";
def URL[] urlsA = [new URL("file:///tmp/cla/")];
def classLoaderA = new URLClassLoader(urlsA, this.getClass().getClassLoader());
def URL[] urlsB = [new URL("file:///tmp/clb/")];
def classLoaderB = new URLClassLoader(urlsB, this.getClass().getClassLoader());
println "Classloader A heirachry:";
showClassLoaderHierarchy(classLoaderA);
println "Classloader B: ";
showClassLoaderHierarchy(classLoaderB);
println "";
println "Now loading Load classes A and B from seperate classloaders:";
def loadA = classLoaderA.loadClass("LoadA").newInstance();
def loadB = classLoaderB.loadClass("LoadB").newInstance();
print "LoadA: heirachry";
showObjectClassLoaderHierarchy(loadA);
print "LoadB: heirachry";
showObjectClassLoaderHierarchy(loadB);
println "";
println "Now pulling the data objects from both and comparing classloders and static data: ";
def dobjA = loadA.getDataObj();
def dobjB = loadB.getDataObj();
println "dataA static field:" + dobjA.getData();
println "dataA static field hashcode: " + dobjA.getData().hashCode();
println "dataA hashcode: " + dobjA.hashCode();
println "dataA classloader: ";
showObjectClassLoaderHierarchy(dobjA);
println "dataB static field: " + dobjB.getData();
println "dataB static field hashcode: " + dobjB.getData().hashCode();
println "dataB hashcode: " + dobjB.hashCode();
println "dataB classLoader:";
showObjectClassLoaderHierarchy(dobjB);
परिणाम हैं:
Setting up child classLoaders A and B...
Classloader A heirachry:
Classloader: 1926764753
Child of: 1163157884
Child of: 1022308509
Classloader B:
Classloader: 846238611
Child of: 1163157884
Child of: 1022308509
Now loading Load classes A and B from seperate classloaders:
LoadA: heirachryClassloader: 1926764753
Child of: 1163157884
Child of: 1022308509
LoadB: heirachryClassloader: 846238611
Child of: 1163157884
Child of: 1022308509
Now pulling the data objects from both and comparing classloders and static data:
dataA static field:Loaded By B
dataA static field hashcode: 1828548084
dataA hashcode: 2083117811
dataA classloader:
Classloader: 1163157884
Child of: 1022308509
dataB static field: Loaded By B
dataB static field hashcode: 1828548084
dataB hashcode: 157683534
dataB classLoader:
Classloader: 1163157884
Child of: 1022308509
आप देखते हैं कि LoadA और LoadB दोनों अलग classloaders है, लेकिन वे एक पैरेंट क्लासलोडर साझा करें।
पैरेंट क्लासलोडर LoadA.dataObj और LoadB.dataObj दोनों उदाहरणों के लिए DataObj लोड करता है।
LoadA.dataObj और LoadB.dataObj के पास विभिन्न हैशकोड हैं।
हालांकि, LoadA.dataObj.data और LoadB.dataObj.data में एक ही हैशकोड है, क्योंकि यह स्थिर वस्तु है। उनके पास एक ही मूल्य है। लोडब ने अपना डेटा ओबीजी को अंतिम रूप दिया और स्ट्रिंग को "बी द्वारा लोड किया गया"
क्या आप सुनिश्चित हैं कि 'कक्षा ए' और 'कक्षा बी' दोनों से बात कर रहे हैं एक ही क्लासलोडर द्वारा लोड की गई 'डेटा' कक्षा में "समान" 'डेटा' वर्ग? यदि विभिन्न क्लासलोडर्स द्वारा 'डेटा' लोड किया जा रहा है और' कक्षा ए 'और' कक्षा बी 'ऐसे विभिन्न संस्करणों से बात कर रहे हैं, तो आप जो देख रहे हैं, वह अपेक्षित है। यह क्लासलोडर पदानुक्रम पर बहुत निर्भर करता है, इसलिए उस संदर्भ का थोड़ा सा मदद करेगा। – mystarrocks
@mystarrocks प्रतिक्रिया के लिए धन्यवाद, जो पहले से ही मदद की है। ऐसा लगता है कि मुझे वास्तव में एक ही कक्षा संदर्भ नहीं मिलता है। मैंने तदनुसार अपना प्रश्न अपडेट किया। धन्यवाद! – WeSt
क्या ये कक्षाएं किसी ऐसे अनुप्रयोग से संबंधित हैं जो सर्वर पर चल रही है? विभिन्न कंटेनर विभिन्न वर्गीकरण तकनीकों का उपयोग करते हैं। – mystarrocks