Простой ответ
Давайте проверим:
public static void main(final String[] args){
System.out.println(long.class.getPackage());
System.out.println(Object[].class.getPackage());
}
Выход:
1009 * нуль *
null
Нет, они не: -)
Примитивные типы
Примитивные классы - это специальные конструкции, в которых нет пакета. Для справки см. Источник Long.TYPE
, псевдоним для long.class
:
/**
* The <code>Class</code> instance representing the primitive type
* <code>long</code>.
*
* @since JDK1.1
*/
public static final Class<Long> TYPE =
(Class<Long>) Class.getPrimitiveClass("long");
Как вы можете видеть, примитивный класс загружается через закрытый для пакета и собственный механизм:
static native Class getPrimitiveClass(String name);
и приведен к Class<Long>
(для включения автобокса, наверное)
Типы оболочек и их примитивные типы
Кстати: каждый класс-оболочка имеет статическое конечное поле с именем TYPE
, которое отображается на соответствующий класс примитивов, как показано в следующем коде:
private static Class<?> getPrimitiveClass(final Class<?> wrapperClass){
try{
final Field field = wrapperClass.getDeclaredField("TYPE");
final int modifiers = field.getModifiers();
if(Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers)
&& Modifier.isFinal(modifiers)
&& Class.class.equals(field.getType())){
return (Class<?>) field.get(null);
} else{
throw new IllegalArgumentException("This is not a wrapper class: "
+ wrapperClass);
}
} catch(final NoSuchFieldException e){
throw new IllegalArgumentException("This is not a wrapper class:"
+ wrapperClass + ", field TYPE doesn't exists.", e);
} catch(final IllegalAccessException e){
throw new IllegalArgumentException("This is not a wrapper class:"
+ wrapperClass + ", field TYPE can't be accessed.", e);
}
}
public static void main(final String[] args){
final List<Class<?>> wrappers =
Arrays.<Class<?>> asList(
Byte.class, Long.class, Integer.class,
Short.class, Boolean.class, Double.class
// etc.
);
for(final Class<?> clazz : wrappers){
System.out.println("Wrapper type: " + clazz.getName()
+ ", primitive type: "
+ getPrimitiveClass(clazz).getCanonicalName());
}
}
Выход:
Тип оболочки: java.lang. Байт, тип примитива: байт
Тип оболочки: java.lang.Long, тип примитива: long
Тип оболочки: java.lang.Integer, тип примитива: int
Тип оболочки: java.lang.Short, тип примитива: короткий
Тип оболочки: java.lang. Boolean, тип примитива: boolean
Тип оболочки: java.lang. Двойной тип примитива: двойной
Типы массивов
Массивы могут быть созданы с помощью Array.newInstance(type, length)
, который внутренне вызывает этот метод:
private static native Object newArray(Class componentType, int length)
throws NegativeArraySizeException;
Опять же, классы - это специальные конструкции, созданные нативным кодом (и у них нет пакета, иначе вы можете их где-нибудь найти)