查看API帮助文档的Object 可以看到有这样一个方法getClass() (这是Object 类的方法) 解释是返回运行时的对象的class对象
HelloWorld.class 也就是 Class<HelloWorld> (API中解释为 T - the type of the class modeled by this Class object. For example, the type of String.class is Class<String> . Use Class<?> if the class being modeled is unknown ) Class<T>中的T有有点像C++中的template<class T> Class<?> 也就是 Class<? extends Object>
?的意思的,由于可能暂时不知道对象的Class类型(或为了简单用?替代) ,因为每个Class<T> 又继承Object ,所以可以代表任意的类型
类型安全 Class Class<T> Class<?>
Colleciton<Object> c List<Object> List<?> List<T> List
在Java集合框架中,对于参数值是未知类型的容器类,只能读取其中元素,不能向其中添加元素, 因为,其类型是未知,所以编译器无法识别添加元素的类型和容器的类型是否兼容,唯一的例外是NULL
关于getGenericSuperclass等等的解释,请参考http://blog.csdn.net/gengv/article/details/5178055
Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
三,class的主要方法
class类的方法还是挺多的。主要是用于得到运行时类的相关信息(可用于反射)。
1, public static Class<?> forName(String className) :natice 方法,动态加载类。非常重要。 如在sql中动态加载驱动程序:class.forName(sqlDriver);
2,public T newInstance() :根据对象的class新建一个对象,用于反射。非常重要。 可用在反射中构建对象,调用对象方法:
class doubleClass= class.forName("java.lang.Double");
Object objDouble = doubleClass.newInstance();
如在javaBean中就应用了这个方法,因为java默认要有一个无参构造函数。
3, public ClassLoader getClassLoader() :获得类的类加载器Bootstrap ,Extension ,System or user custom ClassLoader(一般为system classloader)。重要。
5,public native Class getSuperclass():获取类的父类,继承了父类则返回父类,否则返回java.lang.Object。返回Object的父类为空-null。一般
7,其他类
public boolean isEnum() :判断是否为枚举类型。
public native boolean isArray() :判断是否为数组类型。
public native boolean isPrimitive() :判断是否为基本类型。 public boolean isAnnotation() :判断是否为注解类型。
public Package getPackage() :反射中获得package,如java.lang.Object 的package为java.lang。
public native int getModifiers() : 反射中获得修饰符,如public static void等 。
public Field getField(String name):反射中获得域成员。
public Field[] getFields() :获得域数组成员。
public Method[] getMethods() :获得方法。
public Method getDeclaredMethod(String name, Class<?>... parameterTypes):加个Declared代表本类,继承,父类均不包括。
public Constructor<?>[] getConstructors() :获得所有的构造函数。
class文件 Class 类对象 类实例
class生死大纲 类加载的时机 类加载过程 验证 准备 解析 初始化 使用 卸载
类加载过程: 加载:
1.通过一个类的全限定名来获取定义此类的二进制字节流。这里可以是本地的或者网络的都可以。
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3.在java堆中生成代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。