让我们测试一下:
public static void main(final String[] args){ System.out.println(long.class.getPackage()); System.out.println(Object[].class.getPackage());}
输出:
空
null
不,他们不:-)
基本类型
原始类是没有包的特殊构造。供参考,请参阅的来源
Long.TYPE,别名为
long.class:
public static final Class<Long> TYPE = (Class<Long>) Class.getPrimitiveClass("long");
如您所见,原始类是通过package-private和native机制加载的:
static native Class getPrimitiveClass(String name);
并投射到
Class<Long>(我想为了启用自动装箱)包装器类型及其原始类型
顺便说一句:每个包装器类都有一个静态的final字段
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.Byte,原始类型:字节
包装类型:java.lang.Long,原始类型:long
包装类型:java.lang.Integer,原始类型:int
包装类型:java.lang.Short,原始类型:简短的
包装类型:java.lang.Boolean,原始类型:布尔
型包装类型:java.lang.Double,原始类型:double
数组类型
可以通过创建数组
Array.newInstance(type,length),该数组在内部调用此方法:
private static native Object newArray(Class componentType, int length)throws NegativeArraySizeException;
同样,这些类是由本机代码创建的特殊结构(它们没有包,否则您可以在某个地方找到它们)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)