文章目录
反射
1.反射的概念及演示
- 什么是“反射”:也叫“方向加载”。
正向加载:Student stu = new Student();
反向加载:不直接new对象。我们的程序要通过“一个字符串描述的全类名”让JVM为其在 内存中产生一个Class对象,然后我们的程序通过这个Class对象再创建这个类对象。 - 反射的演示:
- 反射的好处:可以解开类和类之间的“依赖”
2.运行是class文件的加载
3.获取Class对象的三种方式
- 某对象.getClass()方法
- 某类.class属性
- Class.forName(“全类名”);
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException {
//1.调用类的getClass()方法,从Object继承的,任何类都有。
Student student = new Student();
Class c1 = student.getClass();
//2.任何一个数据类型都有一个静态的class属性
Class c2 = Student.class;
Class c3 = int.class;
//3.Class类的静态方法:forName("全类名")
Class c4 = Class.forName("com.magogle.反射演示.Student");
System.out.println(c1 == c2);
System.out.println(c1 == c4);
}
}
class Student {
}
4.获取构造方法并创建对象-Constructor
1).批量获取:
1. public Constructor<?>[] getConstructors():获取所有的"公有"构造方法
2. public Constructor<?>[] getDeclaredConstructors():获取所有的构造方法,包括:公有\受保护\默认\私有.
2):获取单个:[掌握]
1.public Constructor getConstructor(Class<?>… parameterTypes):获取某个"公有"构造方法.
2.public Constructor getDeclaredConstructor(Class<?>… parameterTypes):获取某个构造方法,可以是公有\受保护\默认\私有
3).调用构造方法,创建对象
调用Constructor类的newInstance()方法
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//1.获取他的Class
Class aClass = Class.forName("com.itheima.反射演示.获取构造方法并且创建对象_Constructor.student");
//2.获取Student的构造方法:
//获取所有的构造方法[包括公有.受保护.默认.私有]
Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
for (Constructor dc : declaredConstructors) {
System.out.println(dc);
}
//获取单个构造方法[包括公有.受保护.默认.私有]:
Constructor cs2 = aClass.getDeclaredConstructor();
System.out.println(cs2);
Object o2 = cs2.newInstance();
Constructor cs3 = aClass.getDeclaredConstructor(long.class);
System.out.println(cs3);
Object o3 = cs3.newInstance(10L);
Constructor cs4 = aClass.getDeclaredConstructor(String.class);
System.out.println(cs4);
//暴力访问
cs4.setAccessible(true);
Object o4 = cs4.newInstance("sdf");
Constructor cs5 = aClass.getDeclaredConstructor(String.class,long.class);
System.out.println(cs5);
Object o5 = cs5.newInstance("sdf",10L);
//获取所有[公有]构造方法
Constructor[] constructors = aClass.getConstructors();
for (Constructor cs : constructors) {
System.out.println(cs);
}
//获取单个[公有]构造方法
Constructor cs6 = aClass.getConstructor();
System.out.println(cs6);
Constructor cs7 = aClass.getConstructor(String.class,long.class);
System.out.println(cs7);
}
}
class student{
private String name;
private long age;
public student() {
System.out.println("调用公有无参构造");
}
public student(String name, long age) {
System.out.println("调用公有全参构造");
this.name = name;
this.age = age;
}
protected student(long age) {
System.out.println("调用保护有参构造");
this.age = age;
}
private student(String name) {
System.out.println("调用私有有参构造");
this.name = name;
}
}
5.获取成员属性并赋值和取值-Filed
6.获取成员方法并调用-method
User user = new User();
user.getClass().getMethod("setBirthday", String.class);
7.反射练习
- 通过反射绕过集合的泛型检查:
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
ArrayList<Integer> array = new ArrayList<>();
array.add(19);
array.add(10);
array.add(20);
array.add(31);
Class aClass = array.getClass();
Method add = aClass.getMethod("add", Object.class);
add.invoke(array, "hehe");
for (Object o : array) {
System.out.println(o + "类型" + o.getClass().getName());
}
}
}