JDK 버그-classloader가 array 타입의 클래스 로딩시 ClassNotFoundException발생 (2012.2.현재)
java core 2012. 2. 10. 10:51
지금까지 jdk 6, 7에 항상 일어나는 버그이다.
String [], Byte[]와 같은 Array type ([] )으로 된 클래스를 ClassLoader를 이용해서 클래스 로딩시ClassNotFoundException이 발생한다.
그러나 Class.forName 으로 바꾸면 괜찮다. 이 문제는 reflection을 이용할 때 동일하게 나기 때문에 주의하면서 개발해야 한다.
jdk 6, jdk 7에서의 테스트 코드이다.
public class test { public static void main(String[] args) throws Exception { String[] s = new String[] { "aaa" }; String clName = s.getClass().getName(); Class c = test.class.getClassLoader().loadClass(clName); System.out.println(c); } } |
실행 결과는 다음과 같다.
Exception in thread "main" java.lang.ClassNotFoundException: [Ljava.lang.String; at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) at test.main(test.java:5) |
문제가 안 일어나게 하려면 다음과 같이 코딩해야 한다.
public class test { |
결과는 다음과 같다.
class [Ljava.lang.String; |
이 문제는 “http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149”에 올라와 있다.
비슷한 이슈로 다른 버그(“http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6446627”)도 있다.
public class test { public static Object cloneObject(Object toClone, } |
결과.
Exception in thread "main" java.lang.ClassNotFoundException: [Ljava.lang.String; at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) at test.main(test.java:5) |
이문제는 현재 많은 개발자들은 오라클이 해주기를 기다리고 있다….
오라클 버그 데이터베이스에서는 개발자들이 투표를 통해서 bug를 빨리 처리해달라는 주소도 있으니 참조할 것.
http://bugs.sun.com/bugdatabase/top25_bugs.do
'java core' 카테고리의 다른 글
java 7 은 glic 2.4 이상의 linux에서 동작 (0) | 2012.02.16 |
---|---|
Oracle에서 jdk 7 부터는 G1를 디폴트로 사용한다고 했었는데.. 적용되고 있지 않다. (0) | 2012.02.10 |
Apache Mina 사례에서 본 Selector.select() 이슈- cpu 100% 튀는 현상 (0) | 2012.02.03 |
JDK 1.6.0_22에서 JMX memory leak 이슈 해결 (0) | 2012.02.03 |
jdk 1.7 변화 - OperatingSystemMXBean api 추가 (0) | 2011.12.02 |