反射
2022-05-16 19:25:00 18 举报
AI智能生成
Java反射
作者其他创作
大纲/内容
反射的基本概念
反射:框架的灵魂
框架的概念:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射:将类的各个部分封装为其他对象,这就是反射机制
1.可以在程序的运行过程中。操作这些对象
好处
2.可以解耦,提高代码的可扩展性
Java代码在计算机中的的三个阶段
Source源代码阶段
创建类
按照3部分编译成字节码文件
成员变量
构造方法
成员方法
Class类对象阶段
将字节码用类加载器加载进内存,通过Class类对象描述所有的字节码文件,将该字节码的三个部分分装为对象
字节码的三类对象
Filed类(成员变量类)
设置值
People p=new People();
Filed a=Class对象.getFiled("name");
a.set(p,"张三");
Filed a=Class对象.getFiled("name");
a.set(p,"张三");
获取值
People p=new People();
String name=a.get(p);
String name=a.get(p);
暴力反射
a.setAccessible(true);//暴力反射
constractor类(构造方法类)
初始化对象
Object people=constractor.newInstance("张三",16);
//people对象初始化成功
//people对象初始化成功
暴力反射
constructor.setAccessible(true);//暴力反射
Method(成员方法类)
执行方法
People p=new People();
method.invoke(p);
method.invoke(p);
暴力反射
method.setAccessible(true);
获取方法名称
String name=method.getName();
Runtime对象
创建对象
Class对象
获取Class对象的方式(分别对应反射的3个阶段)
Class.ForName("全类名"):将字节码文件加载进内存,返回Class对象
Source源代码阶段
类名.class:通过类名的属性class获取
Class类对象阶段(此阶段有类名无对象所以用类名创建)
对象.getClass:父类Object类中定义的getClass方法获取(因为对象继承了Object的所有方法)
Runtime对象(此阶段已经创建了对象)
Class对象的使用
获取功能
获取成员变量们
Field[] fileds =Class对象.getFields();
获取所有public修饰的成员变量
Field name = Class对象.getField("name");
获取指定的public修饰的成员变量
Field[] declaredFields = Class对象.getDeclaredFields();
获取所有成员变量
Field age = Class对象.getDeclaredField("age");
获取指定的成员变量,如果获取的是age是私有变量,则忽略安全检查(暴力破解)
暴力反射:age.setAccessible(true);
获取构造方法们
Constructor[] arr=Class对象.getConstructors();获取所有public修饰的构造方法
Constructor con=Class对象.getConstructor(String.class,int.class);获取指定public修饰的构造方法
Constructor[] arra=Class对象.getDeclaredConstructors();获取所有构造方法
Constructor constructor=Class对象.getDeclaredConstructor(String.class);
获取指定的成员变量,如果获取的是age是私有变量,则忽略安全检查(暴力映射)
constructor.setAccessible(true);//暴力反射
获取成员方法们
Method[] methods=Class对象.getMethods();//获取public修饰的方法
Method method=Class对象.getMethod("getName",String.class);//获取指定方法,第一个是选择该名字的方法,第二个是该参数的方法(区分方法的重载)
Method[] mhs=Class对象.getDeclaredMethods();//获取所有方法
Method mh=Class对象.getDeclaredMethod("getName",String.class);//第一个是选择该名字的方法,第二个是该参数的方法(区分方法的重载)
获取类名
String name=Class对象.getName();
0 条评论
下一页