From 39ad071c4f0293dd54359fd6c0839cafdc7072fc Mon Sep 17 00:00:00 2001 From: Muga Nishizawa Date: Thu, 18 Nov 2010 22:26:58 +0900 Subject: [PATCH] java: fixed a bug that javassist cannot find class files that were loaded by custom class loader --- .../org/msgpack/util/codegen/DynamicCodeGen.java | 14 +++++++++++--- .../msgpack/util/codegen/DynamicCodeGenBase.java | 5 +++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java index 7296894..baec70b 100644 --- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java +++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java @@ -46,21 +46,29 @@ import org.msgpack.template.NullableTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -class DynamicCodeGen extends DynamicCodeGenBase implements Constants { +public class DynamicCodeGen extends DynamicCodeGenBase implements Constants { private static Logger LOG = LoggerFactory.getLogger(DynamicCodeGen.class); private static DynamicCodeGen INSTANCE; public static DynamicCodeGen getInstance() { + return getInstance(null); + + } + + public static DynamicCodeGen getInstance(ClassLoader cl) { if (INSTANCE == null) { LOG.info("create an instance of the type: " + DynamicCodeGen.class.getName()); INSTANCE = new DynamicCodeGen(); + if (cl != null) { + INSTANCE.setClassLoader(cl); + } } - return INSTANCE; + return INSTANCE; } - + private ConcurrentHashMap tmplCache; DynamicCodeGen() { diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java index 35a91ab..ac5fb50 100644 --- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java +++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java @@ -38,6 +38,7 @@ import javassist.CtField; import javassist.CtMethod; import javassist.CtNewConstructor; import javassist.CtNewMethod; +import javassist.LoaderClassPath; import javassist.NotFoundException; import org.msgpack.CustomConverter; @@ -151,6 +152,10 @@ public class DynamicCodeGenBase implements Constants { pool = ClassPool.getDefault(); } + protected void setClassLoader(ClassLoader cl) { + pool.appendClassPath(new LoaderClassPath(cl)); + } + protected void checkTypeValidation(Class type) { DynamicCodeGenException e = new DynamicCodeGenException(String.format( "Fatal error: %s", new Object[] { type.getName() }));