反射:在程序运行过程中,通过字节码对象,去获取到类中的成员信息(构造器,方法,字段)
反射作用:在不知道对象的真实类型的情况下去调用对象存在的方法
一. 构造器对象的获取:
1.获取Person类的字节码对象
Class<?> aClass = Class.forName("cn.wolfcode._01_.reflect.Person");
2.获取Person类所有公共构造器对象调用字节码对象的getConstructors()去获取
Constructor<?>[] constructors = aClass.getConstructors();
3.因为获取的是所有公共构造器对象,所有是一个数组类型则需要遍历
for (Constructor<?> constructor : constructors) {
System.out.println("constructor = " + constructor);
}
1.获取Person类的所有构造器对象(包括公有和私有的)
2获取Person类的字节码对象
Class<?> aClass = Class.forName("cn.wolfcode._01_.reflect.Person");
3获取Person类的所有构造器对象调用字节码对象的getDeclaredConstructors()去获取
Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
4.因为获取的是所有公共构造器对象,所有是一个数组类型则需要遍历
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
总结:
公共所有构造器使用getConstructors()
公共指定构造器使用getConstructor()
私有所有构造器使用getDeclaredConstructors()
私有指定的构造器使用getDeclaredConstructor()
二..普通方法对象的获取:
1.获取person类的字节码对象
Class<?> aClass = Class.forName("cn.wolfcode._01_.reflect.Person");
2.获取所有public 方法对象,调用字节码对象的getMethods()去获取
Method[] method = aClass.getMethods();
3.因为获取的是所有公共方法,所有是一个数组类型则需要遍历
for (Method method1 : method) {
System.out.println("method1 = " + method1);
}
1.获取person类的字节码对象
Class<?> aClass = Class.forName("cn.wolfcode._01_.reflect.Person");
2.获取指定参数的private方法,不包括父类的,调用字节码对象的getDeclaredMethod方法获取
Method doWork = aClass.getDeclaredMethod("doWork", String.class);
总结:
公共所有的方法使用getMethods()
公共指定的方法使用getMethod()
私有所有的方法使用getDeclaredMethods()
私有指定的方法使用getDeclaredMethod()