आज, मैंने पाया कि संग्रह। सिंक्रनाइज़ XXXXX का उपयोग प्रतिबिंब के साथ अच्छी तरह से नहीं खेलता है।जावा संग्रह के लिए वर्कअराउंड रैपर प्रतिबिंब तोड़ने
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Weird{
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Hello World");
List<String> wrappedList = Collections.synchronizedList(list);
printSizeUsingReflection(list);
printSizeUsingReflection(wrappedList);
}
private static void printSizeUsingReflection(List<String> list) {
try {
System.out.println(
"size = " + list.getClass().getMethod("size").invoke(list));
} catch (Exception e) {
e.printStackTrace();
}
}
}
printSizeUsingReflection करने के लिए पहली कॉल आकार (यानी "1"), में दूसरी कॉल परिणाम प्रिंट:
java.lang.IllegalAccessException: Class Weird can not access a member of class
java.util.Collections$SynchronizedCollection with modifiers "public"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Method.invoke(Method.java:588)
at Weird.printSizeUsingReflection(Weird.java:18)
at Weird.main(Weird.java:13)
यह एक छोटे से आश्चर्य की बात है और
यहाँ एक सरल उदाहरण है कष्टप्रद। क्या कोई अच्छा कामकाज है? मुझे पता है कि java.util.concurrent में एक थ्रेड-सुरक्षित सूची कार्यान्वयन है, लेकिन यह कार्यान्वयन Collections.synchronizedList() का उपयोग करने से धीमा लगता है।
+1 प्रतिबिंब का उपयोग न करें। 'list.size() 'इन स्थितियों में अच्छी तरह से काम करता है। – akf
अगर मैं कर सकता तो मैं प्रतिबिंब से बचूंगा। इस मामले में, मेरे पास Google Guice द्वारा स्थापित एक एओपी इंटरसेप्टर है, और मैं विधि तर्कों के बारे में उपयोगी चीजों को लॉग करने का प्रयास कर रहा हूं - दुर्भाग्यवश, कक्षा के प्रकार मूल रूप से एकमात्र सोच हैं जो मुझे तर्कों के बारे में पता है। संग्रह.क्लास टिप के लिए धन्यवाद .. एक आकर्षण की तरह काम करता है! –