反射
1.反射的定义
在程序运行过程中分析类的一种能力
2. 分析类。加载并初始化一个类,查看类的所有属性和方法
(类似用Ctrl+P)
3. 步骤
3. 1 获取字节码的三种方式
-
1.获取Class对象 :包名+类名 最为常用
-
Class clazz =Class.forName(" ");
-
2.获取Class对象 :类名.class 一般用来作为参数来传递(syn...)
-
Class clazz1=Student.class;
-
3.有对象可以调用
-
Student s=new Student(); Class clazz2=s.getClass();
3.2 反射获取构造方法
Ctrl + Alt + v = 自动补全
-
getConstructors为public的构造函数
-
getDeclaredConstuctors为All的构造函数
-
//1.Constructor[]cons =clazz.getConstructors(); for(Constructor con:cons) { System.out.println(con); } //2. Constructor[]cons1=clazz.getDeclaredConstructors(); for(Constructor con:cons1) { System.out.println(cons1); } //3.单个 Constructor constructors=clazz.getDeclaredConstructor(String.class,int.class,String.class); //(为参数) //4.修饰符集合(private 为 2 ) int modifiers =constructors.getModifiers(); //5. 通过这个数组,你可以遍历和检查构造函数的所有参数信息。 Parameter[]parameters =constructors.getParameters(); //6.把private 变为可访问 constructors.setAccessible(true);//暴力反射 //7.赋值 Student yfz = (Student)constructors.newInstance("yz", 123, "8");
3. 3反射获取成员变量
-
Field[]P_f=clazz.getFields();//获得public字段 Field[]all_f=clazz.getDeclaredFields();//获得所有字段 for(Field f:P_Filed)//打印 { System.out.println(f); } //单个 Field sex = clazz.getDeclaredField("sex"); //获得名字 String n=sex.getName(); //获得类型 Class type = sex.getType(); //获得修饰符 int modifies=sex.getModifiers(); //获取值 Student s=new Student("yz",19,"na"); sex.setAccessible(true) Object o=sex.get(s);//获取 System.out.println(o); sex.set(s,"yu");//设置
3.4成员方法的反射
Method toString = clazz.getMethod("ToString",String.class); //(方法名, 参数) int modifies=toString.getModifiers(); String name = toString.getName(); Parameter[] parameterTypes = toString.getParameters();// for(Parameter p:parameterTypes)//打印参数 { System.out.println(p); } Class[] exceptionTypes = toString.getExceptionTypes();//打印异常类型 for(Class e:exceptionTypes) { System.out.println(e); } Student s=new Student(); toString.setAccessible(true); //1.是对象 2.参数 Object result =toString.invoke(s,"name",20);//invoke执行函数 //result为结果 System.out.println(result);
4. practice
打印类型与具体的值到a.txt
Class clazz=s.getClass(); Field[] f = clazz.getDeclaredFields(); File file=new File("\\com\\a.txt"); BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file)); BufferedWriter bufferedWriter1=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))); for (Field f1:f) { f1.setAccessible(true); String name=f1.getName(); bufferedWriter.write(name); Object value = f1.get(s); bufferedWriter.write("="+value); bufferedWriter.newLine(); bufferedWriter.flush(); System.out.println(name+"="+value); } bufferedWriter.close();