当前位置: 首页 > news >正文

java反射机制

反射

概述

Java反射是一种程序在运行状态中,仅知道类名时,就可以动态的获取类中的信息,创建对象,调用成员对象的机制。

API

  • java.lang.Class:表示类的对象。其中提供了方法来获取类的字段、方法、构造函数等

    //获取类的Class对象的方法
    //方法1
    String className = "";//需要类的全类名(包名+类名)
    Class cla4 = Class.forName(className);
    ​
    //方法2
    Class cla44 = User.class;
    ​
    //方法3
    User user = new User();
    Class cla444 = user.getClass(); 

  • java.lang.reflect.Field:表示类的字段(属性)。提供了访问和修改字段的方法

    Class cla4 = Class.forName(className);
    ​
    //Class类中相关的方法
    cla4.getField("");//获得指定名称的公共成员变量
    cla4.getFields();//获得所有公共成员变量
    cla4.getDeclaredField("");//获得指定名称的成员变量(包括私有)
    cla4.getDeclaredFields();//获得成员变量(包括私有)

  • java.lang.reflect.Method:表示类的方法。提供了方法来调用方法

    Class cla4 = Class.forName(className);
    ​
    //Class类中相关的方法
    cla4.getMethod("");//获得指定名称的公共成员方法
    cla4.getMethods();//获得所有公共成员方法
    cla4.getDeclaredMethod("");//获得指定名称的成员方法(包括私有)
    cla4.getDeclaredMethods();//获得成员方法(包括私有)

  • java.lang.reflect.Constructor:表示类的构造函数。提供了方法来获取类中构造方法

    Class cla4 = Class.forName(className);
    ​
    //Class类中相关的方法
    cla4.getConstructor("");//只能获得指定的公共构造方法
    cla4.getConstructors();//获得所有公共的构造方法
    cla4.getDeclaredConstructor("");//获得类中指定的方法(包括私有)
    cla4.getDeclaredConstructors();//获得类中所有的构造方法(包括私有)

    流程

//1、通过类名获得Class对象
Class cla4 = Car.getClass();
​
//2、创建对象
Object object = cla4.newInstance();
​
//3、访问字段
Field field = cla4.getDeclaredFields();
field.setAccessible(true); // 如果字段是私有的,需要设置为可访问
Object value = field.get(Car); // 获取字段值
field.set(object, "BMW"); // 设置字段值
​
//4、调用方法
Method method = cla4.getMethod("drive");
method.invoke(object);
​
//5、获取构造方法
Constructor constructor = cla4.getConstructor(String.class,String.class);
Object object1 = constructor.newInstance("YAMAHA","111");//创建对象

应用场景

Mybatis中的ORM(对象关系映射)、组件...

特点

反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力;

反射可以在程序运行时创建一个类的对象,调用成员属性,成员方法,构造方法;

反射是编写框架的基础,他避免了代码写死在框架中,提高了代码的灵活性;

反射中包含一些动态类型,jvm虚拟机不能对其进行优化,因此反射的效率较低;

反射技术最好在没有安全限制的程序环境运行;

反射可以绕过访问限制去访问成员属性和成员方法,这样的操作破坏了java程序的封装性和代码本身的抽象性;


http://www.mrgr.cn/news/12999.html

相关文章:

  • [java][代码]使用java在mongodb上传下载文件
  • 鸿蒙( Beta5版)开发实战:基于AVCodecKit【音视频解码】
  • 【已解决】Vue Duplicate keys detected: ‘[object Object]’
  • 【STM32】FMC
  • 操作符详解
  • go slices.Clone官方文档
  • 力扣(单调递增的数字)
  • AtCoder Beginner Contest 368 题ABCD详细题解(C++,Python)
  • 无法验证 Anaconda 仓库证书
  • rk3568 Android12 增加 USB HOST 模式开关
  • WPF 手撸插件 七 日志记录(二)
  • 协同过滤推荐算法:个性化推荐的基石
  • 速盾:服务器接入cdn后上传图片失败怎么解决?
  • 【python】懂车帝字体反爬逐层解密案例(附完整代码)
  • JS学习大纲
  • react面试题四
  • android selinux报avc denied权限和编译报neverallow解决方案
  • 论文阅读笔记:RepViT: Revisiting Mobile CNN From Vit Perspective
  • Linux C创建进程及父子进程虚拟地址空间(附源码)
  • 通过python解决原神解密