Skip to content

Commit d0455bc

Browse files
committed
load javassist related classes via reflection
1 parent 719f312 commit d0455bc

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

src/main/java/org/msgpack/template/builder/AbstractTemplateBuilder.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.lang.reflect.AccessibleObject;
2222
import java.lang.reflect.Field;
2323
import java.lang.reflect.GenericArrayType;
24+
import java.lang.reflect.InvocationTargetException;
25+
import java.lang.reflect.Method;
2426
import java.lang.reflect.Modifier;
2527
import java.lang.reflect.Type;
2628
import java.util.ArrayList;
@@ -41,8 +43,26 @@
4143
import org.msgpack.template.Template;
4244
import org.msgpack.template.TemplateRegistry;
4345
import org.msgpack.template.builder.TemplateBuildException;
46+
import org.msgpack.util.android.DalvikVmChecker;
4447

4548
public abstract class AbstractTemplateBuilder implements TemplateBuilder {
49+
50+
private static final Method javassistModifierIsAbstractMethod;
51+
static {
52+
Method method = null;
53+
try {
54+
if (!DalvikVmChecker.isDalvikVm()) {
55+
Class<?> clazz = Class.forName("javassist.Modifier");
56+
method = clazz.getMethod("isAbstract", int.class);
57+
}
58+
} catch (ClassNotFoundException e) {
59+
// DalvikVM
60+
} catch (NoSuchMethodException e) {
61+
// TODO: should output any message ?
62+
} finally {
63+
javassistModifierIsAbstractMethod = method;
64+
}
65+
}
4666

4767
protected TemplateRegistry registry;
4868

@@ -72,10 +92,19 @@ public <T> Template<T> buildTemplate(final Class<T> targetClass, final FieldList
7292
protected abstract <T> Template<T> buildTemplate(Class<T> targetClass, FieldEntry[] entries);
7393

7494
protected void checkClassValidation(final Class<?> targetClass) {
75-
if (javassist.Modifier.isAbstract(targetClass.getModifiers())) {
76-
throw new TemplateBuildException(
77-
"Cannot build template for abstract class: " + targetClass.getName());
95+
if (javassistModifierIsAbstractMethod != null) {
96+
try {
97+
if ((Boolean) javassistModifierIsAbstractMethod.invoke(null, targetClass.getModifiers())) {
98+
throw new TemplateBuildException(
99+
"Cannot build template for abstract class: " + targetClass.getName());
100+
}
101+
} catch (IllegalAccessException e) {
102+
new TemplateBuildException(e);
103+
} catch (InvocationTargetException e) {
104+
new TemplateBuildException(e);
105+
}
78106
}
107+
79108
if (targetClass.isInterface()) {
80109
throw new TemplateBuildException(
81110
"Cannot build template for interface: " + targetClass.getName());

src/main/java/org/msgpack/template/builder/TemplateBuilderChain.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
//
1818
package org.msgpack.template.builder;
1919

20+
import java.lang.reflect.Constructor;
21+
import java.lang.reflect.InvocationTargetException;
2022
import java.lang.reflect.Type;
2123
import java.util.ArrayList;
2224
import 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

Comments
 (0)