package com.demo.day01;
public class ClassDemo {
/**
* Person p1 = new Person();
* 1.字节码:当原程序中用到了Person这个类的时候,这个类编译成class文件放在硬盘上就是一堆二进制代码
* 要把这些二进制代码加载到内存中去,才可以用它去创建一个个的对象,内存中的这些代码就是字节码;
* 例如内存中有Person,Date,Math三个对象,则有他们三个对象的字节码:
* Class class1 = Date.class//Date类对应的字节码;
* Class class2 = Person.class//Person类对应的字节码;
* p1.getClass()//这也是获取Person对象的字节码;
* Class.forName("java.lang.String")://得到String类的字节码;
* 这也是 Class.forName("全类名")的作用:即获取该类的字节码;
* 得到某个类的字节码有两种情况:
* 1.这个类的字节码已经加载到内存中(JVM)去了,此时只要找到这个类的字节码,直接返回即可;
* 2.内存中(JVM)没有:此时用类加载器去加载,加载进来后缓存到缓存(JVM)中;
* 得到各个字节码对应的实例对象:
* 1.类名.class()例如:System.class();
* 2.对象.getClass()例如:new Date().getClass();
* 3.Class.forName("全类名")例如:Class.forName("java.util.Date")
* 在JVM中内置了8(基本数据类型)+1(Void)种数据类型的字节码
* 总之:只要是在原程序中出现的类型都有各自的Class实例对象,例如int[],void;
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
String str1 = "abc";
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls1 == cls2);//true
System.out.println(cls1 == cls3);//true
System.out.println(int.class == Integer.class);//false
System.out.println(int.class == Integer.TYPE);//true
System.out.println(int[].class.isPrimitive());//false
System.out.println(int[].class.isArray());//true
}
}
关于java的反射-反射基石:Class
最新推荐文章于 2024-04-02 21:18:56 发布