在 Java 中,原始类型和数组是否有包含包? [英] In Java, do primitive types and arrays have a containing package?
问题描述
在 Java 中,原始类型和数组是否有包含包?
In Java, do primitive types and arrays have a containing package?
可能不是,但只是想确定.
Probably not, but just want to be certain.
推荐答案
简单回答
让我们测试:
public static void main(final String[] args){
System.out.println(long.class.getPackage());
System.out.println(Object[].class.getPackage());
}
输出:
空
空
不,他们没有 :-)
原始类是没有包的特殊结构.参考源码见Long.TYPE
,long.class
的别名:
Primitive classes are special constructs that don't have a package. For reference, see the source of Long.TYPE
, the alias for 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");
如您所见,原始类是通过包私有和本地机制加载的:
As you can see, a primitive class is loaded through a package-private and native mechanism:
static native Class getPrimitiveClass(String name);
并转换为 Class
(我猜是为了启用自动装箱)
and casted to Class<Long>
(in order to enable auto-boxing, I guess)
顺便说一句:每个包装类都有一个名为 TYPE
的静态 final 字段,它映射到相应的原始类,如以下代码所示:
BTW: every wrapper class has a static final field called TYPE
that maps to the corresponding primitive class, as the following code shows:
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.Byte,原始类型:byte
包装类型:java.lang.Long,原始类型:long
包装类型:java.lang.Integer,原始类型:int
包装类型:java.lang.Short,原始类型:short
包装类型:java.lang.Boolean,原始类型:boolean
包装类型:java.lang.Double,原始类型:double
Wrapper type: java.lang.Byte, primitive type: byte
Wrapper type: java.lang.Long, primitive type: long
Wrapper type: java.lang.Integer, primitive type: int
Wrapper type: java.lang.Short, primitive type: short
Wrapper type: java.lang.Boolean, primitive type: boolean
Wrapper type: java.lang.Double, primitive type: double
<小时>
数组类型
数组可以通过Array.newInstance(type, length)
,内部调用这个方法:
Array Types
Arrays can be created through Array.newInstance(type, length)
, which internally calls this method:
private static native Object newArray(Class componentType, int length)
throws NegativeArraySizeException;
同样,这些类是由本机代码创建的特殊结构(它们没有包,否则你可以在某处找到它们)
so again, the classes are special constructs created by native code (and they don't have a package, or else you could find them somewhere)
这篇关于在 Java 中,原始类型和数组是否有包含包?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!