研究反射技术就是研究Class类里面的API ,通过Class可以了解类的方方面面的信息
没有Class cls1=new Class(); //没有这个构造方法
Class cls1=字节码1;
Class cls2=字节码2;
Class 就是内存中的字节码--->然后字节码再搞出对象
Date.class;
p1.getClass(); 对象.getClass; //字节码已经加载起来
Class.forName("java.lang.String") //1.字节码还没有加载,用类加载器把这份字节码加载进来,放到缓存中去,同时方法返回加载的字节码
//2. 字节码已经加载起来
即二进制代码-----字节码-------对象
基本的 Java 类型(boolean
、byte
、char
、short
、int
、long
、float
和 double
)和关键字 void
也表示为 Class
对象。九个特殊对象
如: int.class void.class
Class.isPrimitive() 是不是基本类型?即上面那个
注意:Integer 是包装类,不同于int,各有各的类型
System.out.println(int.class==Integer.class); false
System.out.println(int.class==Integer.TYPE); true Integer.TYPE表示包装类包装的基本类型的字节码
数组也是一种类型
System.out.println(int[].class==Integer.TYPE); false
int.class , Integer.class , intp[].class
反射就是把Java类的各种成分映射成相应的Java类。
成员变量
方法
-- 构造方法 Constructor 代表字节码里面的构造方法
Constructor[] getConstructors();得到所有构造方法
Constructor getConstructor(Object.class<参数类型>,...,...); 得到单独的构造方法
newInstance()
创建此 Class 对象所表示的类的一个新实例
Construct construct=Class.forName("java.lang.String").getConstrucot(参数类型) (StringBuffer.class);
String obj=constructor.newInstance(new StringBuffer("abc")); //编译报错,是不知道你的类型的Constructor 它现在是不知道的
String obj=(String)constructor.newInstance(new StringBuffer("abc"));
-- 包
getPackage() 获取此类的包
-- 变量
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[ ] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
Object Field.get( .class); get(Object obj) 返回指定对象上此Field
表示的字段的值。
ReflectPoint point=new ReflectPoint(1,7);
Field y=poitnt..getClass().getField("y");
System.out.println(y.get("point");
注意:如果是私有变量的话
Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
field.setAccessible(true); 设置可见
-- 方法
Method getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。