Поведение загрузки класса при использовании Byte.class - PullRequest
0 голосов
/ 24 августа 2011

Когда у меня много проверок типов в Java, как это:

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

Загружает ли JVM все эти классы (байт, целое число?) И если это так, есть ли другой способ проверки типов классов без загрузки группы классов, которые мне могут даже не понадобиться?

Ответы [ 4 ]

6 голосов
/ 24 августа 2011

Да, использование .class загрузит класс, но не беспокойтесь об этом - все в java.lang будет уже загружено до того, как ваша программа даже запустится, потому что все эти классы либо используются JVM или используется другими классами API, которые предварительно загружены.

Если вы хотите проверить класс без загрузки класса, вы можете сделать что-то вроде

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

но это было бы довольно хрупко; Я бы избегал этого, если бы не было действительно веской причины.

В любом случае, запустите Java с -verbose:class, чтобы увидеть все предварительно загруженные классы!

1 голос
/ 24 августа 2011

Меня это не волнует, но если вы действительно волнуетесь, вы можете сделать что-то вроде этого:

if (clazz.getName().equals("java.lang.Integer")) // do something
1 голос
/ 24 августа 2011

Любой класс, на который вы явно ссылаетесь внутри другого класса, загружается загрузчиком классов. И получите это ... все классы, на которые эти классы явно ссылаются, будут загружены загрузчиком классов. Так что по сути нет. Если вы ссылаетесь на него, он будет загружен.

1 голос
/ 24 августа 2011

Вы можете легко получить ответ на этот вопрос, проверив, что произойдет, если вы напишите:

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