4

我在 Java ME 环境中编写代码,所以速度绝对是一个重要因素。我已经阅读了几个地方,任何类型的反射(即使是 Java ME 上允许的非常有限的数量)都可能是一个非常大的瓶颈。

所以,我的问题是:做的String.class.getName()慢吗?怎么样myCustomObject.getClass().getName()?用“java.lang.String”和“com.company.MyObject”之类的字符串常量替换它们会更好吗?

如果您想知道,我需要所有原语(以及非原语)的类名,因为 Java ME 不提供默认的序列化实现,因此我必须实现自己的。我需要一个通用的序列化解决方案,它既适用于跨网络的通信,也适用于本地存储(RMS,也适用于 JSR-75)

编辑

我正在使用 Java 1.3 CLDC。

4

3 回答 3

5

String.class.getName()不会很慢,因为它的值将在执行之前加载。即编译器将在 line 执行之前放置它的值。 myCustomObject.getClass().getName()会比以前慢一点,因为它会在执行时被检索

于 2012-08-01T09:53:43.027 回答
1

反射不是不自然的慢;它和您预期的一样慢,但不会更慢。首先,通过反射调用方法需要从反射 API 中显而易见的所有对象创建和方法调用,其次,如果您通过反射调用方法,Hotspot 将无法通过调用进行优化。

调用getClass().getName()也不会比您预期的要慢:几个虚拟方法调用加上一个成员变量获取的成本。.class版本本质上是相同的,加上或减去一个变量提取。

于 2012-07-31T22:16:49.043 回答
0

我不能代表 Java ME,但我对在资源受限系统上使用反射的开销并不感到惊讶。我不认为它慢得令人难以忍受,但您肯定会看到将名称硬编码到变量中的改进。

既然你提到你正在研究序列化,我建议你看看它在Kryo项目中是如何完成的。你可能会发现他们的一些方法很有用,你甚至可以在 Java ME 中使用它。(不幸的是,我对我没有经验)

于 2012-07-31T22:19:32.263 回答