巩固java核心基础-反射

JAVA反射

反射定义

​ 指在JAVA程序运行状态中

  • 给定的一个类(Class)对象,通过反射获取这个类对象的所有成员结构;

  • 给定的一个具体对象,能够动态地调用它的方法及对任意属性值进行获取和赋值

    这种动态获取类的内容,创建对象,以及动态调用对象的方法及操作属性的机制

反射的优劣势

​ 优势:

​ 增加程序的灵活性,避免将固有的逻辑程序写死到代码里

​ 代码简洁,可读性强,可提高代码的复用率

​ 缺点:

​ 相较直接调用在量大的情景下反射性能下降

​ 存在一些内部暴露和安全隐患

反射慢的地方

  • 寻找类Classs字节码的过程
  • 安全机制的权限验证等等
  • 若需要调用native方法调用JNI接口的使用

反射源-java.lang.Class

Package
构造方法 constructor
字段 Field
函数 Method
注解 Annotation
接口
父类

反射基本操作

方法 注释
int modifier = clazz.getModifiers(); //获取类的修饰符
Package package= clazz.getPackage(); //获取类的包名
String fullClassName = clazz.getName(); //获取类的全路径名称
String simpleClassName = clazz.getSimpleName(); //获取类的简单名称
ClassLoader classLoader = clazz.getClassLoader(); //获取类的类加载器
Class[] interfacesClasses = clazz.getInterfaces(); //获取类实现的接口列表
Class fc= clazz.getSuperclass(); //获取类的父类
Annotation[] annotations= clazz.getAnnotations(); //获取类的注解列表

反射字段操作

方法 注释
Field[] fields = clazz.getFields(); //获取类中所有的公有字段 包含继承
Field[] declaredFields=clazz.getDeclaredFields(); //获取类中定义的字段 内部
Field nameField=clazz.getField(“name”); //获取指定名称的公有字段
Field likeDescField=clazz.getDeclaredField(“likeDesc”); //获取指定名称类中定义的字段
int modifersFiled = likeDescField.getModifiers(); //获取字段的修饰
nameField.setAccessible(true); //指定字段强制访问
nameField.set(person,“小皮皮”); //成员字段赋值(需指定对象)
descriptionField.set(null,“没有结婚的都是男孩!”); //静态字段赋值

反射方法操作

方法 注释
Method[] methods = clazz.getMethods(); //获取类中所有的公有方法 继承
Method[] declaredMethods = clazz.getDeclaredMethods(); //获取类中定义的方法
Method talkMethod = clazz.getMethod(“talk”, String.class); //获取类中指定名称和参数的公有方法
Method pugMethod = clazz.getDeclaredMethod(“pickUpGirls”) //获取类中定义指定名称和参数的方法
int modifers = pugMethod .getModifiers(); //获取方法的修饰符
talkMethod.invoke(boy,“I LOVE SEVEN”); //指定对象进行成员方法的调用
pugMethod .setAccessible(true); //指定方法的强制访问
pickUpGirlsMethod.invoke(null); //静态方法的调用

反射构造器操作

方法 注释
Constructor[] cons = clazz.getConstructors(); //获取类中所有的公有构造器
Constructor[] cons = clazz.getDeclaredConstructors(); //获取类中所有的构造器
Constructor conNoParam= clazz.getDeclaredConstructor(); //获取类中无参的构造器
Constructor con= clazz.getDeclaredConstructor(String.class,String.class); //获取类中有参构造
int modifers = con.getModifiers(); //获取构造器的修饰符
conNoParam.newInstance(); //构造器实例对象
con.setAccessible(true); //指定方法的强制访问
con.newInstance(‘abc’,‘def’); //有参构造调用
class.newInstacne(); //class直接调用默认无参构造

反射的应用

​ 通过反射机制可以破坏单例模式

​ 单例模式:

​ 私有化构造参数

​ 全局唯一的公有访问点

反射在Spring框架的应用

你可能感兴趣的:(java核心基础)