1.类加载
public class ClassLoadTest {
public static void main(String[] args) {
ClassLoader c1 = ClassLoader.getSystemClassLoader();
System.out.println(c1);
ClassLoader c2 = c1.getParent();
System.out.println(c2);
System.out.println(c2.getParent()); //Bootstrap一般值为null
}
}
2.反射
2.1反射概念
2.2获取Class类对象
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException {
//通过class属性获取类文件
Class<Student> c1 = Student.class;
System.out.println(c1);
System.out.println("---------");
//通过对象的getClass()获得
Student stu = new Student();
Class<? extends Student> c2 = stu.getClass();
System.out.println(c1==c2);
System.out.println("---------");
//调用Class类的静态方法forName(),给出要的类的全路径
Class<?> c3 = Class.forName("com.test812.Student");
System.out.println(c1==c3);
}
}
2.3反射获取类方法并使用
2.3.1反射获取类构造方法
获取构造函数的数组
public class ReflecGetCon {
public static void main(String[] args) throws ClassNotFoundException{
Class<?> c1 = Class.forName("com.test812.Student");
//获取到公共的构造方法数组
Constructor[] Con1 = c1.getConstructors();
//获取到私有和默认的构造方法数组
Constructor[] con2 = c1.getDeclaredConstructors();
}
}
获取指定构造函数,并利用反射创建对象
public class ReflecGetCon1 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> c1 = Class.forName("com.test812.Student");
//Constructor类提供了一个类的单个构造函数的信息和访问权限
//获取到指定的公共构造方法,参数表示你要获取到的构造方法的参数的个数和类型
Constructor<?> con3 = c1.getConstructor();//这里指定的是无参构造方法
//通过构造方法对象,利用提供的newInstance创建对象,这里是构造方法的反射
Object obj = con3.newInstance();
//获取到所有的构造方法数组
//Constructor con24 = c1.getDeclaredConstructor();
}
}
获取带参数的构造函数,并利用反射创建对象
public class ReflecgetCon2 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
Class<?> s = Class.forName("com.test812.Student");
//获取带参数的公共构造类
Constructor<?> con = s.getConstructor(String.class, int.class);
//利用Constructor的newInstance方法创建对象
Object obj = con.newInstance("Bala",22);
}
}
**暴力反射:**一般不能非本类中用私有方法,但通过setAccessible可暴力反射,取消访问检查
public class ReflecgetCon2 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
Class<?> s = Class.forName("com.test812.Student");
//获取带参数的公共构造类
Constructor<?> con = s.getDeclaredConstructor(String.class, int.class);
con.setAccessible(true);
//利用Constructor的newInstance方法创建对象
Object obj = con.newInstance("Bala",22);
}
}
2.3.2反射获取类的成员变量
获取成员变量的数组或者单个成员变量
public class ReflecgetVar {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> con = Class.forName("com.test812.Student");
//获取成员变量的数组
//Field[] f1 = con.getFields();//获取公共的成员变量数组
//Field[] f2 = con.getDeclaredFields();//获取所有的成员变量数组
//用反射创建对象
Constructor<?> c = con.getConstructor();
Object obj = c.newInstance();
//获取具体公共的成员变量,提供成员变量的名称
Field f3 = con.getField("address");
//调用Field的方法给成员变量赋值
f3.set(obj,"中国");
//获取具体任意的成员变量,提供成员变量的名称
Field f4 = con.getDeclaredField("name");
//为私有变量时,要取消访问检查
f4.setAccessible(true);
//调用Field的方法给成员变量赋值
f4.set(obj,"Bala");
}
}
2.3.2反射获取成员方法
调用私有的时候,要取消访问检查