小编Leo*_*o P的帖子

Java Collections包装器的解决方法打破了反射

今天,我发现使用Collections.synchronizedXXX并不适合反射.

这是一个简单的例子:

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

第一次调用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)
Run Code Online (Sandbox Code Playgroud)

这有点令人惊讶和恼人.有一个很好的解决方法吗?我知道java.util.concurrent中有一个线程安全的List实现,但该实现似乎比使用Collections.synchronizedList()慢.

java reflection

5
推荐指数
1
解决办法
1784
查看次数

标签 统计

java ×1

reflection ×1