1、绕过编译阶段为集合里添加数据
反射时作用在运行时的技术。
集合的泛型约束只在编译阶段有效,编译为class文件后,泛型自动被擦除,此时可以为集合存入其他任意类型的元素。
import java.lang.reflect.Method;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> list=new ArrayList<>();
Class c=list.getClass();
Method method= c.getDeclaredMethod("add",Object.class);
method.invoke(list,"马龙");
System.out.println(list);
}
}
执行后你会发现添加成功了
这里还有突破泛型的另一种方法
import java.util.ArrayList;
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> list=new ArrayList<>();
ArrayList list0=list;
list0.add("马龙");
System.out.println(list);
}
}
执行后你会发现也能添加成功
2、通用框架的底层原理
反射做通用框架
当你拿到任意一个对象,在不清楚对象中的字段时,将对象的字段名称和对应值存到文件中去。
public class MybaitsUtil {
public static void save(Object obj) throws Exception {
PrintStream ps=new PrintStream(new FileOutputStream("D:\\idea代码\\Exercise\\Xulei\\src\\data.txt",true));
Class c=obj.getClass();
System.out.println(c.getName());
ps.println("-----------"+c.getSimpleName()+"------------");
Field[] fields= c.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
ps.println(field.getName()+"="+field.get(obj));
}
}
}
public class Student {
private String name;
private int age;
private char sex;
private String classname;
public Student(){
}
public Student(String name, int age, char sex, String classname) {
this.name = name;
this.age = age;
this.sex = sex;
this.classname = classname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
}
public class Teacher {
private String name;
private int age;
private int salary;
public Teacher(){
}
public Teacher(String name, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
public class Test {
public static void main(String[] args) throws Exception {
Teacher teacher=new Teacher("马龙",30,500000);
MybaitsUtil.save(teacher);
Student student=new Student("小王",18,'男',"二班");
MybaitsUtil.save(student);
}
}
反射的作用总结?
1、可以在运行时得到一个类的全部成分然后操作。
2、可以破坏封装性。
3、可以破坏泛型的约束性。
4、适合做Java高级框架。
5、基本上主流框架都会基于反射设计一些通用的技术功能。