使用Byte.class时的类加载行为

时间:2011-08-24 12:32:07

标签: java jvm classloader

当我在Java中进行大量类型检查时:

if (clazz.equals(Byte.class) <dosomething>
if (clazz.equals(Integer.class) <dosomething>
...

JVM是否加载了所有这些类(Byte,Integer?)如果确实如此,是否有其他方法可以在不加载一堆我甚至不需要的类的情况下进行类类型检查?

4 个答案:

答案 0 :(得分:6)

是的,使用.class将加载该类,但不要担心这些 - java.lang中的所有内容都将在程序运行之前加载,因为这些类都是由JVM本身使用,或由预先加载的其他API类使用。

如果你想在没有加载课程的情况下检查课程,你可以做类似的事情

if (clazz.getName().equals("com.foo.MyClass")) ...

但那将是相当脆弱的;除非有充分的理由,否则我会避免它。

无论如何,有时候用-verbose:class启动Java来查看为你预先加载的所有类!

答案 1 :(得分:1)

如果你写下来,你可以通过测试会发生什么来轻松得到这个问题的答案:

if (c.equals(No.such.class)) ....

答案 2 :(得分:1)

您在另一个类中显式引用的任何类都会被类加载器加载。得到这个......这些类明确引用的类,将由类加载器加载。所以,基本上没有。如果你引用它,它就会被加载。

答案 3 :(得分:1)

我真的不在乎,但如果你真的担心,你可以做这样的事情:

if (clazz.getName().equals("java.lang.Integer")) // do something