1、反射的基石->Class 类。
注意:class 表示类,而Class则是一个类名。Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属于的包名,字段名称的列表,方法名称的列表,等等。
问:如Person 类代表人,那么它的实例对象就是张三,李四这样一个个具体的人,Class类代表Java类,他的各个实例对象又分别对应什么呢?
Class的各个实例对应在内存中的字节码,例如Person 类的字节码,ArrayList 类的字节码等等。一个类被加载器加载到内存中,占用一片存储弓箭,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型
问:如果得到各个字节码对应的实例对象:
类名.class , 例如System.class
对象.getClass() , 例如 new Data().getClass() ;
Class.forName("类名")
九个预定义Class对象:boolean、byte、char、short、int、long、float 和 double和关键字 void 也表示为 Class 对象。
> public boolean isPrimitive()
:判定指定的 Class 对象是否表示一个基本类型。有九种预定义的 Class 对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即 boolean、byte、char、short、int、long、float 和 double。
> Int.Class == Integer.TYPE
数组与Object的关系及其反射类型
import java.lang.reflect.*;
public class ReflectTest {
public static void main(String[] args) throws Exception{
int[] a1 = new int[3];
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
String[] a4 = new String[3];
System.out.println(a1.getClass()==a2.getClass());
System.out.println(a1.getClass().getName());
System.out.println(a1.getClass().getSuperclass().getName());
System.out.println(a2.getClass().getSuperclass().getName());
System.out.println(a3.getClass().getSuperclass().getName());
System.out.println(a4.getClass().getSuperclass().getName());
System.out.println(String.class.getSuperclass().getName());
System.out.println(StringBuffer.class.getSuperclass().getName());
//发现a1,a2,a3,a4的super都是objcet所以可以
Object aObj1 = a1;
Object aObj2 = a4;
//Object[] aObj3 = a1;不对 int 不可以直接转为object
Object[] aObj4 = a3;
Object[] aObj5 = a4;
}
}
成员方法的反射
public class ReflectMethod {
public static void main(String[] args) throws Exception {
Method charAt = String.class.getMethod("charAt", int.class) ;
// 反射方法:方法对象调用对象的方法。
System.out.println(charAt.invoke("abcd", 1)) ;
}