Hôm nay, tôi phát hiện ra rằng việc sử dụng Collections.synchronizedXXX không hoạt động tốt với sự phản chiếu.Cách giải quyết cho trình bao bọc Bộ sưu tập Java phá vỡ sự phản chiếu
Dưới đây là một ví dụ đơn giản:
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();
}
}
}
Cuộc gọi đầu tiên printSizeUsingReflection in kích thước (ví dụ "1"), kết quả cuộc gọi thứ hai trong:
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)
Đây là một chút ngạc nhiên và làm phiền. Có cách giải quyết tốt không? Tôi biết có một thực thi List-safe thread trong java.util.concurrent, nhưng việc thực hiện đó có vẻ chậm hơn so với việc sử dụng Collections.synchronizedList().
+1 chỉ không sử dụng phản chiếu. 'list.size()' hoạt động tốt trong các tình huống này. – akf
Tôi muốn tránh sự phản chiếu nếu có thể. Trong trường hợp này, tôi có một trình chặn AOP được thiết lập bởi Google Guice và tôi đang cố gắng ghi lại những điều hữu ích về các đối số phương thức - không may, các kiểu lớp về cơ bản chỉ là tôi nghĩ về các đối số. Cảm ơn bạn về mẹo Collection.class .. hoạt động như một sự quyến rũ! –