*
*关于类的加载器
* 当程序要使用某个类的时候,如果该类还未被加载到内存中,系统会通过加载 , 连接, 初
* 始化这三步来实现对这个类的进行初始化.
* 1.加载
就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象
2.连接
验证 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用
3.初始化
*关于反射
* java反射机制在运行状态中,对于任何一个类都能获取到这个类的所有属性和方法,并且
* 对于任何类都能调用它的任何方法和属性,这种动态获取信息以及动态调用对象的方法的功
* 能称为java反射机制.
*/
class Person {
private String name;
private int age;
public String address;
public Person() {
System.out.println("空参构造");
}
public Person(String name, int age) {
System.out.println("公有的满参构造方法");
}
private Person(String name) {
System.out.println("私有的带参构造方法");
}
public void fun() {
System.out.println("普通方法!");
}
}
public class JAVA_Reflection {
public static void main(String[] args) throws Exception {
// 获取Class类对象的三种方式
// 第一种
Person p = new Person();
Class c1 = p.getClass();
// 第二种
Class c2 = Person.class;
// 第三种
Class c3 = Class.forName("你要加载的这个类的包名和类名的字符串表示形式");
// 通过反射方式,获取构造方法,创建对象
// 创建这个类的public修饰,两个参数的构造方法
Constructor con1 = c3.getConstructor(String.class, int.class);
// 获取所有publici修饰的构造方法
Constructor[] con2 = c3.getConstructors();
// 获取所有的构造构造方法(包括私有的构造方法);
Constructor[] con3 = c3.getDeclaredConstructors();
// 获取私有的构造方法
Constructor con4 = c3.getDeclaredConstructor(String.class);
// ----------------------------------------------------------------------
/*
* 得到了构造方法 我们就可以调用newInstance(参数),方法来创建实例对象
*/
// 第一种情况是非私有的构造方法
Object object = con1.newInstance(); // 多态的结构
// 第二种情况是私有的构造方法创建对象
// Object object2 = con4.newInstance(23);
// 不能为这个对象进行初始化赋值
/* System.out.println(object2); */
// 必须通过暴力反射机制,对这个构造方法进行暴力获取
con4.setAccessible(true);
// 然后在创建这个对象并初始化
Object object3 = con4.newInstance(23);
// =================================================
// 在反射机制中,把类中的成员变量使用类Field表示 (字段,成员变量,属性)
// 对于这个类的成员变量
// 获取这个Class类的对象
Class c = Class.forName("你要加载的这个类的包名和类名的字符串表示形式");
//获取这个Class类的构造方法
Constructor co = c.getConstructor(null);
// 创建这个类的实例对象
Object obj = co.newInstance();
// 获取成员变量
Field[] fields = c.getFields(); // 获取public修饰的所有成员变量
Field chengyb = c.getDeclaredField("name");
// 通过暴力访问给成员变量赋值,因为name是私有的成员变量
chengyb.setAccessible(true);
// 通过创建这个类的实例对象 进行对这个对象的属性赋值
chengyb.set(obj, "小明");
// =====================================================
/*
* 获取成员方法,步骤如下:
* 1. 获取Class对象
* Class c = Class.forName("你要加载的这个类的包名和类名的字符串表示形式");
*
* 2. 获取构造方法
* Constructor co = c.getConstructor(null); 备注.如果需要私有的构造
* 的构造方法就getDeclaredConstructors();
* 3. 通过构造方法,创建对象
* Object obj = co.newInstance();
* 4. 获取指定的方法
Method 方法名= c.getMethod("方法名","形式参数类型.class");
getDeclaredMethod;获取私有方法
如果方法私有 则通过 获取到的指定方法暴力反射 获取这个方法
方法名.setAccessible(true);
* 5.执行找到的方法
* 方法名.invoke(对象名,实际参数);
*/
}
}