package com.alibaba.json.bvt.serializer; import java.io.IOException; import java.lang.reflect.Field; import java.net.URL; import java.util.Enumeration; import java.util.Set; import java.util.Vector; import junit.framework.TestCase; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.util.ServiceLoader; import com.alibaba.json.demo.X; public class ClassLoaderTest extends TestCase { private ClassLoader ctxLoader; protected void setUp() throws Exception { ctxLoader = Thread.currentThread().getContextClassLoader(); } protected void tearDown() throws Exception { Thread.currentThread().setContextClassLoader(ctxLoader); } public void test_error() throws Exception { Field field = ServiceLoader.class.getDeclaredField("loadedUrls"); field.setAccessible(true); Set<String> loadedUrls = (Set<String>) field.get(null); Thread.currentThread().setContextClassLoader(new MyClassLoader(new ClassCastException())); JSON.toJSONString(new A()); loadedUrls.clear(); Thread.currentThread().setContextClassLoader(new MyClassLoader(new IOException())); JSON.toJSONString(new B()); loadedUrls.clear(); Thread.currentThread().setContextClassLoader(new EmptyClassLoader()); JSON.toJSONString(new C()); loadedUrls.clear(); Thread.currentThread().setContextClassLoader(new ErrorClassLoader()); JSON.toJSONString(new D()); loadedUrls.clear(); Thread.currentThread().setContextClassLoader(ctxLoader); JSON.toJSONString(new E()); } public static class EmptyClassLoader extends ClassLoader { public Enumeration<URL> getResources(String name) throws IOException { return new Vector<URL>().elements(); } } public static class ErrorClassLoader extends ClassLoader { public Class<?> loadClass(String name) throws ClassNotFoundException { return Object.class; } } public static class MyClassLoader extends ClassLoader { private final Exception error; public MyClassLoader(Exception error){ super(); this.error = error; } public Enumeration<URL> getResources(String name) throws IOException { if (error instanceof IOException) { throw (IOException) error; } throw (RuntimeException) error; } } public class A { } public class B { } public class C { } public class D { } public class E { } }