在程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载。连接,初始化三步来实现对这个类的初始化
加载:
就是指将class文件读入内存,并为之创建一个Class对象
任何类被使用时系统将会建立一个Class对象。
连接
验证 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用
初始化 就是讲过的初始化
反射:就是通过class文件对象,去使用该类中的成员变量,构造方法,成员方法,
Class类
成员变量 Filed
构造方法 Constructor
Method
获取class文件对象的方式
Object类中的getClass()方法,几个不同类获得的class对象是同一个对象
数据类型的静态属性class String.Class
Class类中的静态方法: Class forName(string classname) 参数是带包名的全路径
例如:Class c=Class.forName("cn.itcast_01.Person");参数可以再外面写,有提示,然后再粘贴过去
或者在Explorer下java文件下的类名上右键选copy Qualified name
使用哪种方法呢?
自己玩 任选一种,第二种Class c=Persion.class;方便
开发: 第三种
因为第三种是一个字符串,而不是一个具体的类名,这样我们就可以把这样的字符串配置到配置文件中,
用反射获取构造方法并使用。
getConstructors() 获得公共的构造方法。返回的是COnstructor[]
getDeclaredConstructors() 获得所有的额构造方法
getConstructor(...) 获得一个构造方法。参数标识的是:你要火取的构造方法的构造参数个数及数据类型的class字节码文件对象。Constructor con=c.getConstructor(); 返回的是购房方法对象
Object NewInstance(object ...) 使用constructor对象所表示的构造方法来创建改构造方法的声明类的新势力。并用指定的初始化参数初始化该实例
方法总结:以下abc相当于实现一个 Person p=new Person("林青霞",27,"北京");语句。
Class c=Class.forName("cn.itcast_01.Person"); 获得Class对象,字符串可以用配置文件任意指定,
Constructor con=c.getConstructor(String.class,int.class,String.class); 获得他的构造方法,这里的是三个参数的。
Object o=con.NewInstance("林青霞",27,"北京"); 初始化一个对象。
如果一个构造是private的需要在第二步骤改:
Constructor con=c.getDeclaredConstructor(String.class,int.class,String.class);
然后再用con.setAccessible(true);取消检查修饰限制,这个是暴力访问private构造。
获取成员变量:的第二步开始
c.getFields()获取公共的, Field[] f=c.getDealaredField()获取所有的。
获取单个的是Field f=c.getFiled("adress"); adress是例子persion类的地址。
Field里的set(object,object) 将制定对象变量上此Filed对象表示的字段设置为指定的新值
例如 f.set(obj,"北京") obj是反射回来的对象,意思是将obj对象的f字段设置为北京。
获取所有方法
getMethods(); getDeclaredMethods()得到所有的方法
getMethod()得到一个方法 ,包括父类的方法 getDeclaredMethod()得到private的方法,不包括父类的方法。
method.setAccessible(true)
|
|