类加载器
一、类加载器ClassLoader 中的两个方法
- static ClassLoader getSystemClassLoader():返回用于委派的系统类加载器
- ClassLoader getParent():返回父类加载器进行委派
- 例子
public class ClassLoaderDemo {
public static void main(String[] args) {
ClassLoader c = ClassLoader.getSystemClassLoader();
System.out.println(c);
ClassLoader c2 = c.getParent();
System.out.println(c2);
ClassLoader c3 = c2.getParent();
System.out.println(c3);
}
}
反射
一、概述
- 是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。
二、获取Class类对象的三种方式
- 类名.class属性
- 对象名.getClass()方法
- Class.forName(全类名)方法
- 举例:
Class<Student> c1 = Student.class;
System.out.println(c1);
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
System.out.println(c1 == c3);
Class<?> c4 = Class.forName("com.itheima_02.Student");
System.out.println(c1 == c4);
三、反射获取构造方法并使用
- Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组,修饰符为public的构造方法
- Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
- Constructor getConstructor(Class<?>… parameterTypes):返回单个公共构造方法对象,参数:你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象
- Constructor getDeclaredConstructor(Class<?>…parameterTypes):返回单个构造方法对象
- Constructor类用于创建对象的方法:T newInstance(Object…initargs),根据指定的构造方法创建对象
- 例子:
Class<Test1> test1Class = Test1.class;
Constructor<?>[] constructors1 = test1Class.getConstructors();
for (Constructor con1:constructors1){
System.out.println(con1);
}
System.out.println("-------------");
Constructor<?>[] declaredConstructors = test1Class.getDeclaredConstructors();
for (Constructor de:declaredConstructors){
System.out.println(de);
}
System.out.println("-------------");
Constructor<Test1> con = test1Class.getConstructor();
Test1 test1 = con.newInstance();
Constructor<Test1> con2 = test1Class.getConstructor(Integer.class, String.class);
Test1 test2 = con2.newInstance(1,"qwe");
四、反射获取成员变量并使用
- Field[] getFields():返回所有公共成员变量对象的数组
- Field[] getDeclaredFields():返回所有成员变量对象的数组
- Field getField(String name):返回单个公共成员变量对象
- Field getDeclaredField(String name):返回单个成员变量对象
- Field类用于给成员变量赋值的方法:void set(Object obj,Object value),给obj对象的成员变量赋值为value
- 举例:
Class<Test1> test1Class = Test1.class;
Field[] fields = test1Class.getDeclaredFields();
for (Field f:fields){
System.out.println(f);
}
Field nameField = test1Class.getDeclaredField("name");
Constructor<Test1> con = test1Class.getDeclaredConstructor();
Test1 test1 = con.newInstance();
nameField.set(test1,"qwe");
五、反射获取成员方法并使用
- Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的,从object继承的方法也会显示
- Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
- Method getMethod(String name, Class<?>…parameterTypes):返回单个公共成员方法对象
- Method getDeclaredMethod(String name, Class<?>…parameterTypes):返回单个成员方法对象
- Method类用于执行方法的方法:Object invoke(Object obj,Object… args),调用obj对象的成员方法,参数是args,返回值是Object类型
- 举例:
Class<Test1> test1Class = Test1.class;
Method[] methods = test1Class.getMethods();
for (Method m:methods){
System.out.println(m);
}
Method showMethod = test1Class.getMethod("show", String.class);
Constructor<Test1> constructor = test1Class.getConstructor();
Test1 test1 = constructor.newInstance();
showMethod.invoke(test1,"qwe123");