将ASN1包从标准Java(JRE 1.5+;)迁移到J2ME(CLDC 1.1)

将ASN1包从标准Java(JRE 1.5+;)迁移到J2ME(CLDC 1.1),java,arraylist,java-me,asn.1,cldc,Java,Arraylist,Java Me,Asn.1,Cldc,我是Java的新手, 我试图调整JASN1编译器(针对java 1.5+)生成的输出类,使其在BGS5 CLDC 1.1平台上运行。 大多数基本类都已成功修改和编译,但在使用参数化列表或集合类方面仍然存在问题。它在一个基本类上使用,在大多数生成类中使用严重。CLDC1.1设备的java库也不支持它 我的问题有两个方面: 有没有办法将源代码从标准java翻译到J2ME 如何用基本支持的类(如Vector)替换源代码中的参数化列表 包含参数化列表成员的目标类的示例为: //This class fi

我是Java的新手, 我试图调整JASN1编译器(针对java 1.5+)生成的输出类,使其在BGS5 CLDC 1.1平台上运行。 大多数基本类都已成功修改和编译,但在使用参数化列表或集合类方面仍然存在问题。它在一个基本类上使用,在大多数生成类中使用严重。CLDC1.1设备的java库也不支持它

我的问题有两个方面:

  • 有没有办法将源代码从标准java翻译到J2ME
  • 如何用基本支持的类(如Vector)替换源代码中的参数化列表
  • 包含参数化列表成员的目标类的示例为:

    //This class file was automatically generated by jASN1 v1.6.0 (http://www.openmuc.org)
    
    package MyPackage;
    
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Iterator;
    // those packages are not available
    
    public class DeviceInputOutputStatus {
    
        public List<IOStatus> seqOf = null;
        //IOStatus is a class of the package
    
        public DeviceInputOutputStatus () {
            seqOf = new ArrayList<IOStatus>();
        }  
    
        public int encode(BerByteArrayOutputStream os) throws IOException 
        {
            int codeLength = 0;
            for (int i = (seqOf.size() - 1); i >= 0; i--) {
                    codeLength += seqOf.get(i).encode(os, true);
                    //encode is a method of IOStatus
                }
            return codeLength;
        }
    
    }
    
    //该类文件由jASN1 v1.6.0自动生成(http://www.openmuc.org)
    包我的包;
    导入java.util.List;
    导入java.util.ArrayList;
    导入java.util.Iterator;
    //这些软件包不可用
    公共类设备输入输出状态{
    公共列表seqOf=null;
    //IOStatus是包的一个类
    公用设备输入输出状态(){
    seqOf=newarraylist();
    }  
    公共整数编码(BerByteArrayOutputStream os)引发IOException
    {
    int代码长度=0;
    对于(int i=(seqOf.size()-1);i>=0;i--){
    codeLength+=seqOf.get(i).encode(os,true);
    //编码是IOStatus的一种方法
    }
    返回码长;
    }
    }
    
    您必须修改所有生成的代码,以避免使用泛型。更重要的是,不要使用任何集合类,因为JavaME CLDC 1.1不支持它们

    你可以把这看作是一个两步的过程。首先,摆脱泛型的使用。为了消除泛型,您可以只使用普通列表(后面没有尖括号),然后在需要的地方(例如,当您从列表中获取对象时)添加强制转换(从Object到IOStatus或其他)

    第二步:用向量替换列表。您必须比较这两个类的文档,并相应地调整代码


    提示(可能您已经知道这一点):使用javac的-bootclasspath选项将编译器指向CLDC 1.1类库,以确保您不使用不受支持的API,-source 1.3和-target 1.3,以确保您的源代码是兼容的,并生成兼容的字节码。

    但请快点!Java 9即将到来,然后-源和-目标参数将不再存在-(谢谢Kevin,也许我不太清楚,我的意思是避免玩自动生成的类。每当meta asn1模板发生变化时,我都会花费时间,我更喜欢改变基本类并进行较少的依赖性更正。DeviceInputOutStatus和IOStatus是自动生成的类。