Class类简介
Class 类是一个特殊的类,它的一个对象表示某个类被虚拟机加载到专用内存区域(类信息区)
Class类只有一个 private 的构造函数,但实际上只有 Java 虚拟机才能构造一个 Class 对象,这个类只是用来避免自动生成默认的构造函数的
使用Class类得到一个和某类相关的 Class 对象
在创建一个对象时,我们最常用也最简单的一个方法就是使用 new 运算符和类的构造方法,但实际上,我们也可以使用 Class 类来得到某个类的实例,通常使用 forName 函数来得到某个类的对象
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
其中,参数 className必须是类的全名(包含类名)
例如
package demo;
public interface Coder {
void code();
}
package demo;
public class CppCoder implements Coder{
@Override
public void code() {
System.out.println("cpp coder");
}
}
package demo;
public class JavaCoder implements Coder{
@Override
public void code() {
System.out.println("java coder");
}
}
package demo;
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Coder new_coder = new JavaCoder();
new_coder.code();
String name = "demo.JavaCoder";
Class c = Class.forName(name);
Coder coder = (Coder)c.newInstance();
coder.code();
}
}
getClass()
在 java.lang.object 中定义了一个方法 getClass(),因此我们可以使用该方法获得 Class 对象
@HotSpotIntrinsicCandidate
public final native Class<?> getClass();
可以看到在 示例代码中,使用 Class.forName 方法得到的 Class 对象和 使用 getClass方法得到的 Class 对象是相同的
JAVA反射与类加载机制
Java反射机制
在运行状态下,对任意一个类都能知道这个类的所有的属性和方法;并且对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制
类加载机制
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制