java 反射
前言
反射是一切框架的基础,当需要在程序运行时获取对象的构造函数、属性、方法时需要用到反射。
反射的三种方式
三种方式比较起来常用第三种
1.1 Student student=new Student();
Class clazz=student.getClass();
1.2 Class clazz=Class.forName("com.zhangfei.Student");
1.3 Class clazz=Student.class;
反射获取构造函数
Class clazz=Class.forName("com.zhangfei.Student");
Constructor[] cons=clazz.getConstructors();
System.out.println("获取公共的构造函数=========");
for(Constructor con:cons){
System.out.println(con);
}
System.out.println("获取所有的构造函数,包括共有,私有、受保护的=========");
cons=clazz.getDeclaredConstructors();
for(Constructor con:cons){
System.out.println(con);
}
System.out.println("1、调用公共构造函数创建一个对象========");
Constructor constructor=clazz.getConstructor(null);
Student student=(Student) constructor.newInstance();
System.out.println("2、调用包含一个参数的公共构造函数创建一个对象=========");
constructor=clazz.getConstructor(String.class);
student=(Student)constructor.newInstance("zhangfei");
反射获取属性
Field[] fields=clazz.getFields();
System.out.println("3、获取共有属性=======");
for(Field f:fields){
System.out.println(f);
}
fields=clazz.getDeclaredFields();
System.out.println("4、获取所有属性包括共有、私有、受保护的=======");
for(Field f:fields){
System.out.println(f);
}
System.out.println("5、给私有属性name赋值:=========");
Field field=clazz.getDeclaredField("id");
field.setAccessible(true);
field.set(student,1);
Field field2=clazz.getDeclaredField("name");
field2.setAccessible(true);
field2.set(student,"zhangfei");
Field field3=clazz.getDeclaredField("age");
field3.setAccessible(true);
field3.set(student,30);
System.out.println(student.toString());
反射获取方法
这里获取共有方法时会把继承自object对象的方法也获取到。
System.out.println("6、获取公有方法===============");
Method[] methods=clazz.getMethods();
for(Method method:methods){
System.out.println(method);
}
System.out.println("7、获取所有方法,包括公有、私有、受保护的方法========");
methods=clazz.getDeclaredMethods();
for(Method method:methods){
System.out.println(method);
}
System.out.println("8、调用共有方法并调用=======");
Method method=clazz.getMethod("show1");
method.setAccessible(true);
method.invoke(student);
System.out.println("9、调用受保护的方法并且传参=======");
method=clazz.getDeclaredMethod("show2",String.class);
method.setAccessible(true);
method.invoke(student,"zhangfei");