第二十二节——反射

类加载器

一、类加载器ClassLoader 中的两个方法

  1. static ClassLoader getSystemClassLoader():返回用于委派的系统类加载器
  2. ClassLoader getParent():返回父类加载器进行委派
  3. 例子
public class ClassLoaderDemo {
    
    
	public static void main(String[] args) {
    
    
		//static ClassLoader getSystemClassLoader():返回用于委派的系统类加载器
		ClassLoader c = ClassLoader.getSystemClassLoader();
		System.out.println(c); //AppClassLoader
		//ClassLoader getParent():返回父类加载器进行委派
		ClassLoader c2 = c.getParent();
		System.out.println(c2); //PlatformClassLoader
		ClassLoader c3 = c2.getParent();
		System.out.println(c3); //null
	}
}

反射

一、概述

  1. 是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。

二、获取Class类对象的三种方式

  1. 类名.class属性
  2. 对象名.getClass()方法
  3. Class.forName(全类名)方法
  4. 举例:
//使用类的class属性来获取该类对应的Class对象
Class<Student> c1 = Student.class;
System.out.println(c1);

//调用对象的getClass()方法,返回该对象所属类对应的Class对象
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
System.out.println(c1 == c3);  //true

//使用Class类中的静态方法forName(String className)
Class<?> c4 = Class.forName("com.itheima_02.Student");  //包路径.类名
System.out.println(c1 == c4);  //true

三、反射获取构造方法并使用

  1. Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组,修饰符为public的构造方法
  2. Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
  3. Constructor getConstructor(Class<?>… parameterTypes):返回单个公共构造方法对象,参数:你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象
  4. Constructor getDeclaredConstructor(Class<?>…parameterTypes):返回单个构造方法对象
  5. Constructor类用于创建对象的方法:T newInstance(Object…initargs),根据指定的构造方法创建对象
  6. 例子:
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();
//等于Test1 test1 = new Test1();使用无参构造方法创建对象

Constructor<Test1> con2 = test1Class.getConstructor(Integer.class, String.class);
Test1 test2 = con2.newInstance(1,"qwe");
//等于Test1 test1 = new Test1(1,"qwe");使用带参构造方法创建对象

四、反射获取成员变量并使用

  1. Field[] getFields():返回所有公共成员变量对象的数组
  2. Field[] getDeclaredFields():返回所有成员变量对象的数组
  3. Field getField(String name):返回单个公共成员变量对象
  4. Field getDeclaredField(String name):返回单个成员变量对象
  5. Field类用于给成员变量赋值的方法:void set(Object obj,Object value),给obj对象的成员变量赋值为value
  6. 举例:
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");
//等效于Test1 test1 = new Test1();test1.name="qwe";
//这里使用了Field的set方法,对class的name成员变量赋值为qwe

五、反射获取成员方法并使用

  1. Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的,从object继承的方法也会显示
  2. Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
  3. Method getMethod(String name, Class<?>…parameterTypes):返回单个公共成员方法对象
  4. Method getDeclaredMethod(String name, Class<?>…parameterTypes):返回单个成员方法对象
  5. Method类用于执行方法的方法:Object invoke(Object obj,Object… args),调用obj对象的成员方法,参数是args,返回值是Object类型
  6. 举例:
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");
//类似:Test1 constructor = new Test1();constructor.show("qwe123");

猜你喜欢

转载自blog.csdn.net/qq_37589805/article/details/119764637