1、类初始化时机
1/1 创建类的实例
1/2 访问类的静态变量,或者为静态变量赋值
1/3 调用类的静态方法
1/4 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
1/5 初始化某个类的子类
1/6 直接使用java.exe命令来运行某个主类
2、获取Class对象的三种方式
2/1 Object中的public final<?> getClass()
此方法不是静态的,必须使用对象的引用来调用
Student stu = new Student();//此过程会产生一个Student对象空间和一个Class对象空间
Class stuClass = stu.getClass();
2/2 class属性:任何的数据类型(包括基本的数据类型)都有一个静态的class属性,它可以获取这个类的Class对
象
Student stu = new Student();
Class StuClass = Student.class;
2/3 Class类中有一个静态方法(常用方法)
Class forName(StringclassName):className必须是全名限定的类名,即带包名的,否则会抛出
java.lang.ClassNotFoundException异常
Student stu = new Student();
Class stuClass = Class.forName("java.itcast.Student");
3、通过反射获取无参或有参构造方法
3/1 批量获取
public Constructor[] getConstruceors():获取所有公共构造方法
public Constructor[]getDeclaredConstructors():获取所有的(包括私有的)构造方法
3/2 单个获取
public Constructor getConstructor():获取一个共有的构造方法
public ConstructorgetDeclaredConstructor():获取某个构造方法
4、成员方法
public T newInstance():创建此 Class 对象所表示的类的一个新实例
使用方法:构造器.newInstance()
构造器如果是私有的,想修改构造器中参数的值,需要设置暴力访问;
例:
class Student{
String name;
private Student(String name){
this.name = name;
}
……
}
class Demo{
public static void main(String[] args){
Class class01 = Student.class;//获取Class对象
Constructor con = class01.getConstructor(String.class);//获取Class对象所表示的类的私有带参构造方法
con.setVisiable(true);//设置暴力访问
Object obj = con.newInstance("宋茜");//使用构造方法创建一个Class对象所表示的类的实例
Student stu = (Student)obj;//下转型
System.out.println(stu.getName());
}
}
5、通过反射获取成员变量
5/1 批量获取
Field[] getFields():获取所有共有的成员变量
Field[] getDeclaredFields():获取所有的成员变量(包括私有的)
5/2 单个获取
Field getField():获取公有的成员变量(不包含继承的)
Filed getDeclaredField():获取任意的成员变量(不包含继承的)
5/3 给成员变量赋值
set(Object obj,Object value)
给成员变量赋值前一定要、确保堆中有对象空间
私有变量赋值前要设置暴力访问
例:
Field field01 =class01.getDeclaredField("name");//获取name属性
Constructor con = class01.getConstructor();//获取构造方法
Object obj = con.newInstance();//实例化
Student student = (Student)obj;//转型
field01.setAccessible(true);//设置暴力访问
field01.set(student, "宋茜");//设置属性值
System.out.println(student.getName());
6、通过反射获取成员方法
6/1 批量获取
Mthord[] getMethords():获取所有公有的成员方法,包含继承的方法
Methord[] getDeclareMethords():获取所有的成员方法(包括私有的,不包含继承的方法)
6/2 获取单个的
Methord getMethord():获取单个的共有的成员方法
Methord getDeclareMethord():获取某个单个的成员方法
6/3 调用方法
publicObject invoke(Object obj,Object... args)
传参给成员方法时要先实例化,在堆中产生对象空间
对私有成员方法传参是要先设置暴力访问