44import com .github .ltsopensource .core .commons .utils .BeanUtils ;
55import com .github .ltsopensource .core .commons .utils .ClassHelper ;
66import com .github .ltsopensource .core .commons .utils .ReflectionUtils ;
7+ import com .github .ltsopensource .core .compiler .AbstractCompiler ;
78import com .github .ltsopensource .core .compiler .Compiler ;
8- import com .github .ltsopensource .core .compiler .JdkCompiler ;
99import com .github .ltsopensource .core .exception .LtsRuntimeException ;
1010import com .github .ltsopensource .core .logger .Logger ;
1111import com .github .ltsopensource .core .logger .LoggerFactory ;
1212
1313import java .lang .reflect .Field ;
1414import java .lang .reflect .Method ;
1515import java .lang .reflect .Modifier ;
16- import java .lang .reflect .Type ;
1716import java .util .Map ;
1817import java .util .concurrent .ConcurrentHashMap ;
1918import java .util .concurrent .ConcurrentMap ;
2019import java .util .concurrent .atomic .AtomicInteger ;
2120
2221/**
2322 * @author Robert HG ([email protected] ) on 4/2/16. 23+ * 为了兼容javaassist 去掉泛型
2424 */
2525public final class BeanCopierFactory {
2626
2727 private static final Logger LOGGER = LoggerFactory .getLogger (BeanCopierFactory .class );
2828
29- private static Compiler COMPILER = new JdkCompiler ();
29+ private static Compiler COMPILER = AbstractCompiler . getCompiler ();
3030 private static final AtomicInteger SEQ = new AtomicInteger (0 );
3131 private static final ConcurrentMap <Integer , Map <String , PropConverter <?, ?>>> SEQ_PROP_CVT_MAP = new ConcurrentHashMap <Integer , Map <String , PropConverter <?, ?>>>();
3232
33- public static void setCompiler (Compiler compiler ) {
34- if (compiler == null ) {
35- throw new IllegalArgumentException ("compiler should not be null" );
36- }
37- BeanCopierFactory .COMPILER = compiler ;
38- }
39-
4033 public static <Source , Target > BeanCopier <Source , Target > createCopier (
4134 Class <?> sourceClass , Class <?> targetClass ) {
4235 return createCopier (sourceClass , targetClass , false , null );
@@ -68,7 +61,13 @@ public static <Source, Target> BeanCopier<Source, Target> createCopier(
6861
6962 try {
7063 Class <?> beanCopierClazz = COMPILER .compile (getClassCode (sequence , sourceClass , targetClass , deepCopy , propCvtMap ));
71- return (BeanCopier <Source , Target >) beanCopierClazz .newInstance ();
64+ final BeanCopierAdapter beanCopier = (BeanCopierAdapter ) beanCopierClazz .newInstance ();
65+ return new BeanCopier <Source , Target >() {
66+ @ Override
67+ public void copyProps (Source source , Target target ) {
68+ beanCopier .copyProps (source , target );
69+ }
70+ };
7271 } catch (Exception e ) {
7372 throw new LtsRuntimeException ("Generate BeanCopier error, sourceClass=" + sourceClass .getName () + ", targetClass=" + targetClass .getName (), e );
7473 }
@@ -82,13 +81,14 @@ private static String getClassCode(Integer sequence, Class<?> sourceClass, Class
8281 JavaSourceBean javaSourceBean = new JavaSourceBean ();
8382 javaSourceBean .setPackageName (BeanCopierFactory .class .getPackage ().getName ());
8483
85- javaSourceBean .addImport (BeanCopier .class .getName ());
84+ javaSourceBean .addImport (BeanCopierAdapter .class .getName ());
8685 javaSourceBean .addImport (sourceClass .getName ());
8786 javaSourceBean .addImport (targetClass .getName ());
87+ javaSourceBean .addImport (PropConverter .class .getName ());
8888
8989 String beanCopierClassName = sourceClass .getSimpleName () + "2" + targetClass .getSimpleName () + BeanCopier .class .getSimpleName () + sequence ;
9090 String classDefinitionCode = "public class " + beanCopierClassName +
91- " implements " + BeanCopier .class .getSimpleName () + "<" + sourceClass . getSimpleName () + "," + targetClass . getSimpleName () + ">" ;
91+ " extends " + BeanCopierAdapter .class .getSimpleName ();
9292
9393 javaSourceBean .setClassDefinition (classDefinitionCode );
9494
@@ -106,7 +106,9 @@ private static String getClassCode(Integer sequence, Class<?> sourceClass, Class
106106 private static String getMethodImplCode (Integer sequence , Class <?> sourceClass , Class <?> targetClass , boolean deepCopy , final Map <String , PropConverter <?, ?>> propCvtMap ) throws Exception {
107107
108108 StringBuilder methodCode = new StringBuilder ();
109- methodCode .append ("public void copyProps(" ).append (sourceClass .getSimpleName ()).append (" source, " ).append (targetClass .getSimpleName ()).append (" target){\n " );
109+ methodCode .append ("public void copyProps(" ).append (Object .class .getName ()).append (" sourceObj, " ).append (Object .class .getName ()).append (" targetObj){\n " );
110+ methodCode .append (sourceClass .getSimpleName ()).append (" source = " ).append ("(" ).append (sourceClass .getSimpleName ()).append (")sourceObj;\n " );
111+ methodCode .append (targetClass .getSimpleName ()).append (" target = " ).append ("(" ).append (targetClass .getSimpleName ()).append (")targetObj;\n " );
110112
111113 // 这里查找了包括父类的属性
112114 Field [] targetFields = ReflectionUtils .findFields (targetClass );
@@ -116,7 +118,6 @@ private static String getMethodImplCode(Integer sequence, Class<?> sourceClass,
116118 // 是否含有set方法
117119 String methodNameSuffix = capitalize (field .getName ());
118120 Class <?> targetFieldClass = field .getType ();
119- Type targetFieldType = field .getGenericType ();
120121
121122 Method setMethod = ReflectionUtils .findMethod (targetClass , "set" + methodNameSuffix , targetFieldClass );
122123 if (setMethod != null ) {
@@ -125,12 +126,12 @@ private static String getMethodImplCode(Integer sequence, Class<?> sourceClass,
125126 if (propCvtMap != null && propCvtMap .containsKey (field .getName ())) {
126127
127128 String converterName = field .getName () + "Converter" ;
128- String converterType = PropConverter .class .getName () + "<" + sourceClass . getSimpleName () + ", " + targetFieldType . toString () + "> " ;
129+ String converterType = PropConverter .class .getSimpleName ();
129130
130- methodCode .append (converterType ).append (converterName ).append (" = (" ).append (converterType ).append (")" )
131+ methodCode .append (converterType ).append (" " ). append ( converterName ).append (" = (" ).append (converterType ).append (")" )
131132 .append (BeanCopierFactory .class .getName ()).append (".getConverter(" ).append (sequence ).append ("," ).append ("\" " ).append (field .getName ()).append ("\" );\n " );
132133 methodCode .append ("target." ).append (setMethod .getName ()).append ("(" )
133- .append ("(" ).append (targetFieldType . toString ()).append (")" ).append (converterName ).append (".convert(" ).append ("source" ).append (")" )
134+ .append ("(" ).append (targetFieldClass . getName ()).append (")" ).append (converterName ).append (".convert(" ).append ("source" ).append (")" )
134135 .append (");\n " );
135136 continue ;
136137 }
@@ -154,7 +155,7 @@ private static String getMethodImplCode(Integer sequence, Class<?> sourceClass,
154155 } else {
155156 // 深度复制,对于非基本类型的采用流的方式拷贝
156157 methodCode .append ("target." ).append (setMethod .getName ()).append ("(" )
157- .append ("(" ).append (targetFieldType . toString ()).append (")" )
158+ .append ("(" ).append (targetFieldClass . getName ()).append (")" )
158159 .append (BeanUtils .class .getName ()).append (".deepClone(" )
159160 .append ("source." ).append (getMethod .getName ()).append ("()" )
160161 .append (")" )
@@ -184,7 +185,7 @@ private static String capitalize(String str) {
184185 /**
185186 * 会被动态类使用
186187 */
187- public static PropConverter <?, ?> getConverter (Integer sequence , String propName ) {
188+ public static PropConverter <?, ?> getConverter (int sequence , String propName ) {
188189 Map <String , PropConverter <?, ?>> map = SEQ_PROP_CVT_MAP .get (sequence );
189190 return map .get (propName );
190191 }
0 commit comments