Class类
Class类的实例表示java应用运行时的类或接口(每个java类在运行的时候都会在JVM里表现为一个Class对象,可以通过类名.Class
,类型.getClass()
,Class.forName("包.类名")
等方法获取Class对象)
Class类的特点
Class类的父类是Object,事实上,任何java类,不管是jdk里面的还是自定义的,都是Class类的对象,同时,所有的数据类型、关键字、方法等等,一切的一切都是Class类的对象。这是前提,很关键
Class类的运行原理
java种创建对象时不是通过类直接创建的,一个类的对象被创建之前,首先JVM会加载该类的字节码文件(.class文件),也就是编译后的java程序文件;加载完成后,JVM会自动的为该类创建自己的Class对象,再通过Class对象创建目标对象
使用Class的目的
很简单的一句话,可以利用反射机制重新获取到Object对象,这个是动态加载类以及对象的,是在程序运行时才会发生的动作,至于反射机制的具体应用,先挖个坑,以后填
API文档的仿制
按照Class类的特性,java种的一切都是Class类的对象,我们可以获取到这些“对象”的信息,比如任意类的属性、构造方法、所有方法等等信息,诚然,我们甚至可以做出一个API文档
public static void main(String[] args) throws ClassNotFoundException{
// 1.返回与带有给定字符串名的类或接口相关联的 Class 对象,直接导致该类被初始化
Class testClass = Class.forName("java.lang.Class");
// 2. 获取该类的实例化对象
Class testClass2 = Class.class;
// 3.获取该类的实例化Class对象
Class testClass3 = new Test().getClass();
String target = "([a-zA-Z_-]+)\\."; // 需要匹配的正则表达式,表示了形如“字母+.”的模式,这样便去除了某个类的包名前缀
Class<? super Object> superC = testClass.getSuperclass();
String name = superC.getName();
System.out.print("Class的父类是:" + name.replaceAll(target, "") + "\n");
Constructor<Class>[] consClass = testClass.getDeclaredConstructors();
System.out.println("Class的构造方法有:");
for(Constructor con : consClass){
name = con.toString();
name = name.replaceAll(target, "");
System.out.println(name);
}
Class<Class>[] classes = testClass.getClasses();
System.out.println("Clsass所有的成员的公共类和接口:");
if(classes.length==0)
System.out.println("null");
for(Class cla : classes){
name = cla.toString();
name = name.replaceAll(target, "");
System.out.println(name);
}
System.out.println("Class的属性是:");
Field[] fields = testClass.getDeclaredFields();
for(Field f : fields){
name = f.toString();
name = name.replaceAll(target, "");
System.out.println(name);
}
Method[] methods = testClass.getMethods();
System.out.println("Class的所有方法是:");
for(int i=0; i<methods.length; i++){
name = methods[i].toString();
name = name.replaceAll(target, "");
System.out.println(name);
}
ClassLoader loader = testClass.getClassLoader();// 如果对象是基本类型或者是void,则返回null
System.out.println("Class的类加载器是:" + loader);
这只是一个简单的思路介绍,重要的是从0到1的过程,至于怎么从1到n,这需要更多的努力。