AsmSupport缺陷还真多,本来打算用于TalkingBird的直接本地代码执行引擎的开发,没想到AsmSupport存在动态绑定的缺陷,通过修正AsmSupport底层实现解决动态绑定,结果又出现栈溢出。甚是让人奔溃。
怎么解决动态绑定的问题呢?
首先我们要搞清楚如下代码是否是合理的:
import java.io.Serializable; import org.junit.Test; public class Test1 { @Test public void test1(){ byte b = 1; fun(b); } public void fun(byte i){//① System.out.println("byte"); } public void fun(short i){//② System.out.println("short"); } public void fun(int i){//③ System.out.println("int"); } public void fun(long i){//④ System.out.println("long"); } public void fun(float i){//⑤ System.out.println("float"); } public void fun(double i){//⑥ System.out.println("double"); } public void fun(Byte i){//⑦ System.out.println("Byte"); } public void fun(Serializable i){//⑧ System.out.println("Serializable"); } public void fun(Object i){//⑨ System.out.println("Object"); } }
相信大家都知道运行结果输出byte.
那么这样呢,注掉①的函数重载。
结果是short,结果还是可以理解,Java自动对原生类型进行拓展。
那么注掉从①——⑥,结果都是能够理解的。但是注掉⑦后,结果就费解了,结果居然是Serializable,却不是我们熟知的Object。原来是因为包装类实现了序列化接口,直到最后才是Object。
其他基本数据类型依次逻辑递推,注意short之后是int,不是char。
char的拓展类型是int,特别注意,short不能拓展到char。
对于拆箱呢。
则依据如下顺序,包装类->Serializable->Object->对应原生数据类型。
要解决AsmSupport的缺陷,必须重写cn.wensiqun.asmsupport.utils.AClassUtils#GetDirectSuperType()方法在获取父类的逻辑。
/** * 获取一个给定的类的超类<br> * boolean:boolean->Boolean->Serializable->Object<br> * byte:byte->short->int->long->float->double->Byte->Serializable->Object<br> * short:short->int->long->float->double->Short->Serializable->Object<br> * char:char->int->long->float->double->Character->Serializable->Object<br> * int:int->long->float->double->Integer->Serializable->Object<br> * long:long->float->double->Long->Serializable->Object<br> * float:float->double->Float->Serializable->Object<br> * double:double->Double->Serializable->Object<br> * Serializable:Serializable->Object<br> * 拆箱发生在最后<br> * Boolean:Boolean->Serializable->Object->boolean<br> * Byte:Byte->Serializable->Object->byte<br> * Short:Short->Serializable->Object->short<br> * Character:Character->Serializable->Object->char<br> * Integer:Integer->Serializable->Object->int<br> * Long:Long->Serializable->Object->long<br> * Float:Float->Serializable->Object->float<br> * Double:Double->Serializable->Object->double<br> * 如果是object无父类<br> * 如果是接口获取所有父接口<br> * 如果是是数组:<br> * int[]: int[] -> Serializable ->Cloneable->Object 如果有超类,延继承链获取所有超类和接口<br> * * @param aclass * 传入的类 * @param autoWrapper * 是否允许自动装箱 * @return */ public static AClass[] getDirectSuperType(AClass as) { AClass[] a = null; // 如果是原生数据类型 if (as.isPrimitive()) { if (as.equals(AClass.BOOLEAN_ACLASS)) { a = new AClass[] { AClass.BOOLEAN_WRAP_ACLASS, AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS }; } else if (as.equals(AClass.BYTE_ACLASS)) { a = new AClass[] { AClass.SHORT_ACLASS, AClass.INT_ACLASS, AClass.LONG_ACLASS, AClass.FLOAT_ACLASS, AClass.DOUBLE_ACLASS, AClass.BYTE_WRAP_ACLASS, AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS }; } else if (as.equals(AClass.SHORT_ACLASS)) { a = new AClass[] { AClass.INT_ACLASS, AClass.LONG_ACLASS, AClass.FLOAT_ACLASS, AClass.DOUBLE_ACLASS, AClass.SHORT_WRAP_ACLASS, AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS }; } else if (as.equals(AClass.CHAR_ACLASS)) { a = new AClass[] { AClass.INT_ACLASS, AClass.LONG_ACLASS, AClass.FLOAT_ACLASS, AClass.DOUBLE_ACLASS, AClass.CHARACTER_WRAP_ACLASS, AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS }; } else if (as.equals(AClass.INT_ACLASS)) { a = new AClass[] { AClass.LONG_ACLASS, AClass.FLOAT_ACLASS, AClass.DOUBLE_ACLASS, AClass.INTEGER_WRAP_ACLASS, AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS }; } else if (as.equals(AClass.LONG_ACLASS)) { a = new AClass[] { AClass.FLOAT_ACLASS, AClass.DOUBLE_ACLASS, AClass.LONG_WRAP_ACLASS, AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS }; } else if (as.equals(AClass.FLOAT_ACLASS)) { a = new AClass[] { AClass.DOUBLE_ACLASS, AClass.FLOAT_WRAP_ACLASS, AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS }; } else if (as.equals(AClass.DOUBLE_ACLASS)) { a = new AClass[] { AClass.DOUBLE_WRAP_ACLASS, AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS }; } return a; } else if (as.equals(AClass.BOOLEAN_WRAP_ACLASS)) { a = new AClass[] { AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS, AClass.BOOLEAN_ACLASS }; return a; } else if (as.equals(AClass.BYTE_WRAP_ACLASS)) { a = new AClass[] { AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS, AClass.BYTE_ACLASS }; return a; } else if (as.equals(AClass.SHORT_WRAP_ACLASS)) { a = new AClass[] { AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS, AClass.SHORT_ACLASS }; return a; } else if (as.equals(AClass.CHARACTER_WRAP_ACLASS)) { a = new AClass[] { AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS, AClass.CHAR_ACLASS }; return a; } else if (as.equals(AClass.INTEGER_WRAP_ACLASS)) { a = new AClass[] { AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS, AClass.INT_ACLASS }; return a; } else if (as.equals(AClass.LONG_WRAP_ACLASS)) { a = new AClass[] { AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS, AClass.LONG_ACLASS }; return a; } else if (as.equals(AClass.FLOAT_WRAP_ACLASS)) { a = new AClass[] { AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS, AClass.FLOAT_ACLASS }; return a; } else if (as.equals(AClass.DOUBLE_WRAP_ACLASS)) { a = new AClass[] { AClass.SERIALIZABLE_ACLASS, AClass.OBJECT_ACLASS, AClass.DOUBLE_ACLASS }; return a; } else if (as.equals(AClass.SERIALIZABLE_ACLASS)) {// 如果传入的是序列化接口,则有父类Object a = new AClass[] { AClass.OBJECT_ACLASS }; return a; } else if (as.equals(AClass.OBJECT_ACLASS)) {// 如果传入的是Object,则没有父类 a = new AClass[0]; return a; } else if (as.isInterface()) {// 如果是接口 Class<?>[] intfacs = as.getInterfaces(); if (intfacs != null && intfacs.length > 0) { AClass[] interfaceAClassArr = new AClass[intfacs.length]; List<AClass> list = new ArrayList<AClass>(); for (int i = 0; i < intfacs.length; i++) { interfaceAClassArr[i] = AClassFactory.getProductClass(intfacs[i]); list.add(interfaceAClassArr[i]); } // 因为Java规范不支持平行接口的重载 // for (AClass interAClass: interfaceAClassArr) { // AClass[] aclassArr = getDirectSuperType(interAClass, true); // for (AClass aClass : aclassArr) { // list.add(aClass); // } // } list.add(AClass.OBJECT_ACLASS); a = list.toArray(new AClass[list.size()]); } else { a = new AClass[] { AClass.OBJECT_ACLASS }; } return a; } else if (as.isArray()) {// 如果是数组,当组件为原生数据类型则获取克隆接口和序列化接口;否则获取组件的所有父类 ArrayClass ac = (ArrayClass) as; AClass rootType = ac.getRootComponentClass(); if (rootType.isPrimitive()) { a = new AClass[3]; a[0] = AClass.SERIALIZABLE_ACLASS; a[1] = AClass.CLONEABLE_ACLASS; a[2] = AClass.OBJECT_ACLASS; return a; } else { AClass[] rootSupers = getDirectSuperType(rootType);// 获取组件的超类,构建数组的超类数组 if (rootSupers != null) {// 如果组件存在超类 a = new AClass[rootSupers.length]; for (int i = 0; i < a.length; i++) { a[i] = AClassFactory.getArrayClass(rootSupers[i], ac.getDimension()); } return a; } else {// 如果组件不存在超类,则使用克隆接口和序列化接口 a = new AClass[3]; a[0] = AClass.SERIALIZABLE_ACLASS; a[1] = AClass.CLONEABLE_ACLASS; a[2] = AClass.OBJECT_ACLASS; return a; } } } else {// 如果都不是,则开始延继承链寻找 Class<?> sup = as.getSuperClass(); Class<?>[] intefaces = as.getInterfaces(); List<AClass> list = new ArrayList<AClass>(); AClass supAClass = null; // 只有当父类不是Object才增加 if (sup != Object.class) { supAClass = AClassFactory.getProductClass(sup); list.add(supAClass); } for (Class clazz : intefaces) { if (clazz != Object.class) { AClass interfaceAClass = AClassFactory.getProductClass(clazz); list.add(interfaceAClass); } } //有除了Object的父类 if (supAClass != null) { AClass[] superAClassArr = getDirectSuperType(supAClass); // 任何类都有Object这个父类 for (AClass aClass : superAClassArr) { if (aClass.equals(AClass.OBJECT_ACLASS)) { continue; } else { if (!list.contains(aClass)) { list.add(aClass); } } } } list.add(AClass.OBJECT_ACLASS); a = list.toArray(new AClass[list.size()]); return a; } }