Java me 非JSR-75设备上的JSR-75特定代码?
我想做的事 我正在编写一个J2ME midlet,我想使用JSR-75来编写文件。我还希望能够在不支持JSR-75的设备上运行我的应用程序 我是怎么做的 我发现了一个网站,解释了如何做到这一点(忘记了URL,抱歉):Java me 非JSR-75设备上的JSR-75特定代码?,java-me,classnotfound,jsr75,Java Me,Classnotfound,Jsr75,我想做的事 我正在编写一个J2ME midlet,我想使用JSR-75来编写文件。我还希望能够在不支持JSR-75的设备上运行我的应用程序 我是怎么做的 我发现了一个网站,解释了如何做到这一点(忘记了URL,抱歉): 创建公开所有功能的公共抽象类(“服务”) 创建一个包私有类(“ServiceImplementation”),扩展这个抽象类,实现所有功能 将两者放在一个单独的包中,将服务呈现为包的外观 要实例化此类,请使用抽象类中的以下方法: public static Service ge
- 创建公开所有功能的公共抽象类(“服务”)
- 创建一个包私有类(“ServiceImplementation”),扩展这个抽象类,实现所有功能
- 将两者放在一个单独的包中,将服务呈现为包的外观
public static Service getInstance() {
try {
Class.forName("javax.microedition.io.file.FileConnection");
Class c = Class.forName("my.package.Service");
Service service = (Service) (c.newInstance());
return service;
} catch (Exception e) {
return null;
}
}
出了什么问题
当JSR-75存在时,这一点非常有效。问题是,我希望这个midlet也能在非JSR-75设备上运行,而这段代码在我尝试这样做时抛出一个ClassNotFoundException:javax/microedition/io/file/FileConnection,即使我捕获了所有异常
我已经做了一个项目范围的搜索,以确保除了在服务和服务实现中使用FileConnection之外,我没有在其他任何地方使用FileConnection
有人知道我该怎么做吗?显然我可以用这个:
System.getProperty("microedition.io.file.FileConnection.version");
如果返回null,则不支持JSR-75。如果它返回任何其他内容,它就是。对您正在做的事情有点困惑,特别是对于不同包中的两个类,它们都称为Service!但我在编写代码以在有或没有特定JSR的手机上运行时遇到了这个问题 您是否在服务类中引用JSR-75类?我怀疑即使您没有实例化服务类,它仍然在被加载。JVM随后遇到了这些不存在的类
将对JSR-75类的所有引用移动到从服务类引用的类中。执行class.forName()足以引发ClassNotFoundException,因为它试图加载类以创建类对象。当然,但由于我捕获了所有异常,它不应该导致应用程序因该异常而停止。我已经在这样做了。我只有一个名为Service的类和一个名为ServiceImplementation的类,它们都在同一个包中。后者是包私有的,这是我引用JSR-75类的唯一类。不管怎样,现在都解决了。我只是不明白为什么本应捕获的异常仍然被抛出,导致应用程序停止。服务(从所有手机访问)是否引用ServiceImplementation(引用JSR-75)?尝试将JSR-75引用移动到另一个仅从ServiceImplementation引用的类。没有任何对象直接引用ServiceImplementation。唯一的“引用”在服务中,如下所示:Class.forName(“my.package.ServiceImplementation”).newInstance()。但正如你在我自己的答案评论中所看到的,它现在起作用了。两种方法都应该起作用。如果你用If(System.getProperty(“microedition.io.file.FileConnection.version”)!=null替换上面代码中的{Class.forName(“javax.microedition.io.file.FileConnection”);…等等,{…一切正常吗?是的,这种方法有效。我想接受我的答案作为接受的答案,但我还得再等5个小时。。。