1.反射允许对成员变量,成员方法和构造方法的信息进行编程访问
2.获取class对象的三种方法
-->class.forName("全类名")
-->类名.class
-->对象.getClass()
public class ReflectDemo1{
public static void main(String[] args){
//最常用的
Class clazz1=Class.forName("com.demo.myreflect1.student");
System.out.println(clazz1);
//一般更多的是当参数进行传递
Class clazz2=Student.class;
System.out.println(clazz2);
//当我们有了这个类的对象时,才可以使用
Student s=new Student();
Class clazz3=s.getClass();
System.out.println(clazz3);
System.out.println(clazz3==clazz2);//true
}
}
3.利用反射获取构造方法
Public class ReflectDemo{
public static void main(String[] args) throws ClassNotFoundException{
//获取class字节码文件对象
Class clazz=Class.forName("com.demo.myreflect1.student"");
//获取构造器
Constructor[] cons=clazz.getConstructors();
for (Constructor con:cons){
System.out.println(con);
}
Constructor con1=clazz.getDeclaredConstructor(String.class);
System.out.println(con1);
}
}
4.利用反射获取成员变量
5.利用反射获取成员方法
6.反射的作用
-->获取一个类里所有的信息,获取到之后,再执行其他的业务逻辑;结合配置文件,动态的创建对象并调用方法
Public class MyReflectDemo{
public static void main(String[] args) throws IllegalAccessException{
Student s=new Student("小红",23,"女",167,"睡觉");
Teacher t=new Teacher("张三",10000);
saveObject(s);
}
//将对象里所有的成员变量名和值保存到本地文件中
public static void saveObject(Object obj)throws IllegalAccessException{
Class clazz=obj.getClass();
//创建IO流
BufferedWriter bw=new BufferedWriter(new FileWriter("reflect\\a.txt"));
Field[] fields=clazz.getDeclaredFields();
for (Field field:fields){
field.setAccessible(true);
String name=field.getName();
Object value=field.get(obj);
// System.out.println(name+"="+value);
//写出数据
bw.write(name+"="+value);
bw.newLine();//写入一个行分隔符
}
bw.close();
}