This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 086fd06a19ee6a64973925438db4419a67ca6031 Author: wujimin <wuji...@huawei.com> AuthorDate: Mon May 7 17:15:28 2018 +0800 [scb-533][WIP] JavassistUtils switch from JavaType to CtType --- .../servicecomb/common/javassist/ClassConfig.java | 6 ++- .../servicecomb/common/javassist/FieldConfig.java | 28 +++-------- .../common/javassist/JavassistUtils.java | 55 +++++----------------- .../servicecomb/common/javassist/MethodConfig.java | 22 ++++++--- .../common/javassist/ParameterConfig.java | 8 ++-- .../common/javassist/TestJavassistUtils.java | 46 +++++++++--------- 6 files changed, 65 insertions(+), 100 deletions(-) diff --git a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/ClassConfig.java b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/ClassConfig.java index 9471d7a..bc070ba 100644 --- a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/ClassConfig.java +++ b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/ClassConfig.java @@ -73,9 +73,13 @@ public class ClassConfig { } public FieldConfig addField(String name, JavaType javaType) { + return addField(name, new CtType(javaType)); + } + + public FieldConfig addField(String name, CtType ctType) { FieldConfig field = new FieldConfig(); field.setName(name); - field.setType(javaType); + field.setType(ctType); fieldList.add(field); diff --git a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/FieldConfig.java b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/FieldConfig.java index c630b73..8975690 100644 --- a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/FieldConfig.java +++ b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/FieldConfig.java @@ -17,17 +17,12 @@ package org.apache.servicecomb.common.javassist; -import org.springframework.util.ClassUtils; - import com.fasterxml.jackson.databind.JavaType; public class FieldConfig { private String name; - // javassist的成员不支持int这样的类型,必须是Integer才行 - private Class<?> rawType; - - private JavaType type; + private CtType type; private boolean genGetter; @@ -41,17 +36,16 @@ public class FieldConfig { this.name = name; } - public Class<?> getRawType() { - return rawType; + public CtType getType() { + return type; } - public JavaType getType() { - return type; + public void setType(JavaType javaType) { + this.type = new CtType(javaType); } - public void setType(JavaType type) { - this.rawType = ClassUtils.resolvePrimitiveIfNecessary(type.getRawClass()); - this.type = type; + public void setType(CtType ctType) { + this.type = ctType; } public boolean isGenGetter() { @@ -69,12 +63,4 @@ public class FieldConfig { public void setGenSetter(boolean genSetter) { this.genSetter = genSetter; } - - public String getGenericSignature() { - if (type.hasGenericTypes()) { - return type.getGenericSignature(); - } - - return null; - } } diff --git a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/JavassistUtils.java b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/JavassistUtils.java index 631215a..025ea94 100644 --- a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/JavassistUtils.java +++ b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/JavassistUtils.java @@ -26,9 +26,7 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.ClassUtils; -import com.fasterxml.jackson.databind.JavaType; import com.google.common.hash.Hashing; import javassist.CannotCompileException; @@ -38,7 +36,6 @@ import javassist.CtConstructor; import javassist.CtField; import javassist.CtMethod; import javassist.scopedpool.ScopedClassPoolRepositoryImpl; -import javassist.NotFoundException; public final class JavassistUtils { private static final Logger LOGGER = LoggerFactory.getLogger(JavassistUtils.class); @@ -163,7 +160,7 @@ public final class JavassistUtils { } for (FieldConfig fieldConfig : config.getFieldList()) { - CtField field = createCtField(classPool, ctClass, fieldConfig); + CtField field = createCtField(ctClass, fieldConfig); ctClass.addField(field); if (fieldConfig.isGenGetter()) { @@ -205,9 +202,9 @@ public final class JavassistUtils { private static void addFieldGetter(ClassConfig config, FieldConfig fieldConfig) { MethodConfig methodConfig = new MethodConfig(); - Class<?> cls = fieldConfig.getRawType(); String prefix = "get"; - if (cls.equals(Boolean.class) || cls.equals(boolean.class)) { + if (boolean.class.getName().equals(fieldConfig.getType().getCtClass().getName()) + || Boolean.class.getName().equals(fieldConfig.getType().getCtClass().getName())) { prefix = "is"; } methodConfig.setName(prefix + capitalize(fieldConfig.getName())); @@ -254,7 +251,7 @@ public final class JavassistUtils { } } - private static String genReadFieldsMethodSource(List<FieldConfig> fieldList) throws Exception { + private static String genReadFieldsMethodSource(List<FieldConfig> fieldList) { StringBuilder sb = new StringBuilder(); sb.append("public Object[] readFields(){"); sb.append(String.format("Object values[] = new Object[%d];", fieldList.size())); @@ -273,17 +270,16 @@ public final class JavassistUtils { return sb.toString(); } - private static String genWriteFieldsMethodSource(List<FieldConfig> fieldList) throws Exception { + private static String genWriteFieldsMethodSource(List<FieldConfig> fieldList) { StringBuilder sb = new StringBuilder(); sb.append("public void writeFields(Object[] values){"); for (int idx = 0; idx < fieldList.size(); idx++) { FieldConfig fieldConfig = fieldList.get(idx); String fieldName = fieldConfig.getName(); - Class<?> type = fieldConfig.getRawType(); String code = String.format(" %s = (%s)values[%d];", fieldName, - type.getTypeName(), + fieldConfig.getType().getCtClass().getName(), idx); sb.append(code); @@ -293,7 +289,7 @@ public final class JavassistUtils { return sb.toString(); } - private static String genReadFieldMethodSource(List<FieldConfig> fieldList) throws Exception { + private static String genReadFieldMethodSource(List<FieldConfig> fieldList) { StringBuilder sb = new StringBuilder(); sb.append("public Object readField(){"); @@ -308,7 +304,7 @@ public final class JavassistUtils { return sb.toString(); } - private static String genWriteFieldMethodSource(List<FieldConfig> fieldList) throws Exception { + private static String genWriteFieldMethodSource(List<FieldConfig> fieldList) { StringBuilder sb = new StringBuilder(); sb.append("public void writeField(Object value){"); @@ -317,7 +313,7 @@ public final class JavassistUtils { sb.append( String.format(" %s=(%s)value;", fieldConfig.getName(), - fieldConfig.getRawType().getTypeName())); + fieldConfig.getType().getCtClass().getName())); } sb.append("}"); @@ -325,37 +321,12 @@ public final class JavassistUtils { return sb.toString(); } - private static CtField createCtField(ClassPool pool, CtClass ctClass, FieldConfig field) throws Exception { - Class<?> fieldType = field.getRawType(); - - CtField ctField = new CtField(pool.getCtClass(fieldType.getName()), field.getName(), ctClass); - if (field.getGenericSignature() != null) { - ctField.setGenericSignature(field.getGenericSignature()); + private static CtField createCtField(CtClass ctClass, FieldConfig field) throws CannotCompileException { + CtField ctField = new CtField(field.getType().getCtClass(), field.getName(), ctClass); + if (field.getType().hasGenericTypes()) { + ctField.setGenericSignature(field.getType().getGenericSignature()); } ctField.setModifiers(Modifier.PUBLIC); return ctField; } - - public static String getNameForGenerateCode(JavaType javaType) { - if (byte[].class.equals(javaType.getRawClass())) { - return "byte[]"; - } - - if (!javaType.isArrayType()) { - Class<?> rawClass = ClassUtils.resolvePrimitiveIfNecessary(javaType.getRawClass()); - return rawClass.getTypeName(); - } - - return javaType.getContentType().getRawClass().getName() + "[]"; - } - - // for test - public static void detach(String clsName) { - try { - ClassPool classPool = getOrCreateClassPool(Thread.currentThread().getContextClassLoader()); - classPool.getCtClass(clsName).detach(); - } catch (NotFoundException e) { - // do nothing. - } - } } diff --git a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/MethodConfig.java b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/MethodConfig.java index aa0b773..437c308 100644 --- a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/MethodConfig.java +++ b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/MethodConfig.java @@ -25,7 +25,7 @@ import com.fasterxml.jackson.databind.JavaType; public class MethodConfig { private String name; - private JavaType result; + private CtType result; private List<ParameterConfig> parameterList = new ArrayList<>(); @@ -60,14 +60,22 @@ public class MethodConfig { this.name = name; } - public void setResult(JavaType result) { + public void setResult(JavaType javaType) { + this.result = new CtType(javaType); + } + + public void setResult(CtType result) { this.result = result; } - public void addParameter(String name, JavaType type) { + public void addParameter(String name, JavaType javaType) { + addParameter(name, new CtType(javaType)); + } + + public void addParameter(String name, CtType ctType) { ParameterConfig parameterConfig = new ParameterConfig(); parameterConfig.setName(name); - parameterConfig.setType(type); + parameterConfig.setType(ctType); parameterList.add(parameterConfig); } @@ -84,17 +92,17 @@ public class MethodConfig { StringBuilder sbMethodGenericSignature = new StringBuilder(); sbMethod.append("public "); - sbMethod.append(result == null ? "void" : JavassistUtils.getNameForGenerateCode(result)); + sbMethod.append(result == null ? "void" : result.getCtClass().getName()); sbMethod.append(" ") .append(name) .append("("); sbMethodGenericSignature.append("("); - boolean hasGenericSignature = result == null ? false : result.hasGenericTypes(); + boolean hasGenericSignature = result != null && result.hasGenericTypes(); for (ParameterConfig parameter : parameterList) { hasGenericSignature = hasGenericSignature || parameter.getType().hasGenericTypes(); - String paramTypeName = JavassistUtils.getNameForGenerateCode(parameter.getType()); + String paramTypeName = parameter.getType().getCtClass().getName(); String code = String.format("%s %s,", paramTypeName, parameter.getName()); sbMethod.append(code); sbMethodGenericSignature.append(parameter.getType().getGenericSignature()); diff --git a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/ParameterConfig.java b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/ParameterConfig.java index d7281e6..3234ccb 100644 --- a/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/ParameterConfig.java +++ b/common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/ParameterConfig.java @@ -16,12 +16,10 @@ */ package org.apache.servicecomb.common.javassist; -import com.fasterxml.jackson.databind.JavaType; - public class ParameterConfig { private String name; - private JavaType type; + private CtType type; public String getName() { return name; @@ -31,11 +29,11 @@ public class ParameterConfig { this.name = name; } - public JavaType getType() { + public CtType getType() { return type; } - public void setType(JavaType type) { + public void setType(CtType type) { this.type = type; } } diff --git a/common/common-javassist/src/test/java/org/apache/servicecomb/common/javassist/TestJavassistUtils.java b/common/common-javassist/src/test/java/org/apache/servicecomb/common/javassist/TestJavassistUtils.java index e656ee7..6869bf2 100644 --- a/common/common-javassist/src/test/java/org/apache/servicecomb/common/javassist/TestJavassistUtils.java +++ b/common/common-javassist/src/test/java/org/apache/servicecomb/common/javassist/TestJavassistUtils.java @@ -33,11 +33,11 @@ import org.apache.servicecomb.foundation.common.utils.ReflectUtils; import org.junit.Assert; import org.junit.Test; -import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; import com.google.common.hash.Hashing; import javassist.ClassPool; +import javassist.scopedpool.ScopedClassPoolRepositoryImpl; import mockit.Deencapsulation; public class TestJavassistUtils { @@ -54,11 +54,17 @@ public class TestJavassistUtils { fieldConfig.setGenGetter(true); fieldConfig.setGenSetter(true); - fieldConfig = classConfig.addField("listStringField", - TypeFactory.defaultInstance().constructCollectionType(List.class, String.class)); + fieldConfig = classConfig + .addField("listStringField", TypeFactory.defaultInstance().constructCollectionType(List.class, String.class)); fieldConfig.setGenGetter(true); fieldConfig.setGenSetter(true); + fieldConfig = classConfig.addField("bool", TypeFactory.defaultInstance().constructType(boolean.class)); + fieldConfig.setGenGetter(true); + + fieldConfig = classConfig.addField("wrapperBool", TypeFactory.defaultInstance().constructType(Boolean.class)); + fieldConfig.setGenGetter(true); + Class<?> cls = JavassistUtils.createClass(classConfig); Field field = cls.getField("intField"); @@ -78,6 +84,12 @@ public class TestJavassistUtils { method = cls.getMethod("getListStringField"); Assert.assertEquals("java.util.List<java.lang.String>", method.getGenericReturnType().getTypeName()); + + method = cls.getMethod("isBool"); + Assert.assertEquals(Boolean.class, method.getReturnType()); + + method = cls.getMethod("isWrapperBool"); + Assert.assertEquals(Boolean.class, method.getReturnType()); } @Test @@ -90,10 +102,9 @@ public class TestJavassistUtils { MethodConfig methodConfig = new MethodConfig(); methodConfig.setName("method"); methodConfig.setResult(TypeFactory.defaultInstance().constructCollectionType(List.class, String.class)); - methodConfig.addParameter("map", - TypeFactory.defaultInstance().constructMapType(Map.class, String.class, String.class)); - methodConfig.addParameter("set", - TypeFactory.defaultInstance().constructCollectionType(Set.class, String.class)); + methodConfig + .addParameter("map", TypeFactory.defaultInstance().constructMapType(Map.class, String.class, String.class)); + methodConfig.addParameter("set", TypeFactory.defaultInstance().constructCollectionType(Set.class, String.class)); classConfig.addMethod(methodConfig); Class<?> intf = JavassistUtils.createClass(classConfig); @@ -238,21 +249,6 @@ public class TestJavassistUtils { } @Test - public void testGetNameForGenerateCode() { - JavaType jt = TypeFactory.defaultInstance().constructType(byte[].class); - String name = JavassistUtils.getNameForGenerateCode(jt); - Assert.assertEquals("byte[]", name); - - jt = TypeFactory.defaultInstance().constructType(Byte[].class); - name = JavassistUtils.getNameForGenerateCode(jt); - Assert.assertEquals("java.lang.Byte[]", name); - - jt = TypeFactory.defaultInstance().constructType(Object[].class); - name = JavassistUtils.getNameForGenerateCode(jt); - Assert.assertEquals("java.lang.Object[]", name); - } - - @Test public void managerClassPool() { ClassLoader classLoader1 = new ClassLoader() { }; @@ -263,8 +259,10 @@ public class TestJavassistUtils { ClassPool p2 = Deencapsulation.invoke(JavassistUtils.class, "getOrCreateClassPool", classLoader2); Assert.assertNotSame(p1, p2); - Map<ClassLoader, ClassPool> CLASSPOOLS = Deencapsulation.getField(JavassistUtils.class, "CLASSPOOLS"); JavassistUtils.clearByClassLoader(classLoader1); - Assert.assertNull(CLASSPOOLS.get(classLoader1)); + Assert.assertFalse(ScopedClassPoolRepositoryImpl.getInstance().getRegisteredCLs().containsKey(classLoader1)); + + JavassistUtils.clearByClassLoader(classLoader2); + Assert.assertFalse(ScopedClassPoolRepositoryImpl.getInstance().getRegisteredCLs().containsKey(classLoader2)); } } -- To stop receiving notification emails like this one, please contact liu...@apache.org.