1717//
1818package org .msgpack .template .builder ;
1919
20+ import java .lang .reflect .Constructor ;
21+ import java .lang .reflect .InvocationTargetException ;
2022import java .lang .reflect .Type ;
2123import java .util .ArrayList ;
2224import java .util .List ;
@@ -29,6 +31,24 @@ public class TemplateBuilderChain {
2931 private static boolean enableDynamicCodeGeneration () {
3032 return !DalvikVmChecker .isDalvikVm ();
3133 }
34+
35+ private static final Constructor <?> javassistTemplateBuilderConstructor ;
36+ static {
37+ Constructor <?> constructor = null ;
38+ try {
39+ if (!DalvikVmChecker .isDalvikVm ()) {
40+ Class <?> clazz = Class .forName ("org.msgpack.template.builder.JavassistTemplateBuilder" );
41+ constructor = clazz .getConstructor (TemplateRegistry .class , ClassLoader .class );
42+ }
43+ } catch (ClassNotFoundException e ) {
44+ // DalvikVM
45+ } catch (NoSuchMethodException e ) {
46+ // TODO: should output any message ?
47+ }
48+ finally {
49+ javassistTemplateBuilderConstructor = constructor ;
50+ }
51+ }
3252
3353 protected List <TemplateBuilder > templateBuilders ;
3454
@@ -51,22 +71,37 @@ protected void reset(final TemplateRegistry registry, final ClassLoader cl) {
5171 // FIXME
5272 // Javassist{,Beans}TemplateBuilder should be created with reflection for android.
5373
54- // forceBuilder
55- forceBuilder = new JavassistTemplateBuilder (registry , cl );
74+ TemplateBuilder javassistTemplateBuilder = null ;
75+ if (javassistTemplateBuilderConstructor != null ) {
76+ try {
77+ javassistTemplateBuilder = (TemplateBuilder ) javassistTemplateBuilderConstructor .newInstance (registry , cl );
78+ } catch (InstantiationException e ) {
79+ new IllegalStateException (e );
80+ } catch (IllegalAccessException e ) {
81+ new IllegalStateException (e );
82+ } catch (InvocationTargetException e ) {
83+ new IllegalStateException (e );
84+ }
85+ }
5686
5787 // builder
5888 TemplateBuilder builder ;
5989 templateBuilders .add (new ArrayTemplateBuilder (registry ));
6090 templateBuilders .add (new OrdinalEnumTemplateBuilder (registry ));
61- if (enableDynamicCodeGeneration ()) { // use dynamic code generation
91+ if (enableDynamicCodeGeneration () && javassistTemplateBuilder != null ) { // use dynamic code generation
92+ // forceBuilder
93+ forceBuilder = javassistTemplateBuilder ;
94+
6295 builder = forceBuilder ;
6396 templateBuilders .add (builder );
6497 // FIXME #MN next version
6598 // templateBuilders.add(new
6699 // JavassistBeansTemplateBuilder(registry));
67100 templateBuilders .add (new ReflectionBeansTemplateBuilder (registry ));
68101 } else { // use reflection
69- builder = new ReflectionTemplateBuilder (registry );
102+ // forceBuilder
103+ forceBuilder = new ReflectionTemplateBuilder (registry );
104+ builder = forceBuilder ;
70105 templateBuilders .add (builder );
71106 templateBuilders .add (new ReflectionBeansTemplateBuilder (registry ));
72107 }
0 commit comments