Object.class.getName()慢吗?

时间:2012-07-31 22:10:49

标签: java serialization reflection java-me cldc

我正在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。

3 个答案:

答案 0 :(得分:5)

String.class.getName()不会很慢,因为它的值将在执行之前加载。编译器将在执行行之前将其值放入。 myCustomObject.getClass().getName()更慢然后是之前,因为它将在执行时被检索

答案 1 :(得分:1)

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

调用getClass().getName()并不比你预期的要慢:一些虚方法调用的成本加上成员变量提取。 .class版本基本相同,加上或减去变量提取。

答案 2 :(得分:0)

我不能代表Java ME,但我对通过在资源受限系统上使用反射而产生的开销并不感到惊讶。我不认为它是无法忍受的缓慢,但肯定会看到将名称硬编码为变量的改进。

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