我们知道java是面向对象,所有的事物都是用面向对象的思想去思考这类事物有什么,比如人,有腿 眼睛,鼻子,这些就是累的属性,还可以跑,打球,这是对象的方法,但是有一种很特殊的类,就是各个java类,比如Person,Dog等,这些可以向上抽取成一个父类,那就是Class,Class类描述了类的的名字,类所属的包名,字段名称的列表,Class其实代表的是这个类在内存中的的字节码,
字节码:当程序运行时,会从硬盘上把类的二进制代码编译成Class放在硬盘中,然后加载到内存当中,然后才可以用这个Class去创建对象,每一个字节码就是一个Class对象
获取类的字节码有三种方式
1:对象.getClass()
2:类.class
3:Class.forName(类的全路径);这个方法是先判断该类的字节码是否在内存中,没有不在就用类加载器把类加载到内存中
一个类的字节码在内存中只有一份,下面通过代码验证:
Person.java
public class Person {
private String name;
public Person(String name) {
super();
this.name = name;
}
public Person() {
}
}
PersonTest.java
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person("SS");
Class cs1 = p1.getClass();
Class cs2 = p2.getClass();
Class cs3 = p3.getClass();
System.out.println(cs1==cs2);
System.out.println(cs1==cs3);
}
}
打印结果:
true
true
这就说明类的字节码在内存中只有一个,但是可以用这个字节码创建很多个对象,
现在看看Class类一些方法
getField(String name)
返回一个Field
对象,它反映此 Class
对象所表示的类或接口的指定公共成员字段
getFields()
返回一个包含某些Field
对象的数组,这些对象反映此 Class
对象所表示的类或接口的所有可访问公共字段。
getMethods()
返回一个包含某些Method
对象的数组,这些对象反映此 Class
对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member 方法
getName()
以String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
getPackage()获取此类的包
getSimpleName()返回源代码中给出的底层类的简称。
isArray()判定此
Class
对象是否表示一个数组类。
isPrimitive() 判定指定的
Class
对象是否表示一个基本类型。