java 之 反射 (结合Class理解)

2023-11-04

反射机制使静态语言java变为准动态语言

Reflection 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法

反射方式 实例化对象--》getClass()方法--》得到完整的“包类”名称

类加载完之后,堆内存中产生一个class型对象。(一个类只能有一个Class对象),这个对象中包含了完整的类的结构信息。一个类被加载之后,所有类结构都会被封装到class对象中

反射相关的主要API

  • java.lang.Class 代表一个类
  • java.lang.reflect.Method 代表类的方法
  • java.lang.reflect.Field 代表类的成员变量
  • java.lang.reflect.Constructor 代表类的构造器

通过反射可以获取类的包名,全类名

  • class.getName()
  • class.getSimpleName()

可以获得类的属性

  • .getFields() 获得的都是类中的非私有属性
  • .getDeclaredFields() 获得全部的属性 
  • 以上加参数可以获得指定属性,比如.getFields("name")

可以获得类的方法

  • .getMethods()  非私有方法
  • .getDeclaredMethods() 全部方法
  • 也可以获得指定方法如 class.getMethods("getName",null) 
  • 如果有重载方法的话后面给出指定参数 如class.getMethods("getName",String.class) int.class等

可以获得指定的构造器

  • .getConstructors()
  • .getDeclaredConstructors()

可以通过调用class对象的newInstance()方法

  • 类必须有无参构造器
  • 类的构造器的访问权限需要足够

还可以通过构造器创建对象

  1. 首先获取到对应的构造器。
  2. 用对应的构造器的newInstance创建一个对象

调用指定的方法

通过反射,调用类中的方法,通过Method类完成

  1. 通过getMethod(String name,Class parameterType ) 获取到一个Method对象。并设置此方法需要的参数类型。
  2. 使用 Object invoke(Object obj,Object args),并向方法中传递设置的obj对象的参数信息。

简单来说就是获得通过方法获得方法之后,通过invoke激活一下

直接上例子

package com.company;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Author:XK
 * @Date: Created in 17:25 2021/10/25
 * @Description: 测试反射调用一个方法
 **/
public class Test03 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class c1 = Class.forName("com.company.User");

        //构造一个对象
        User user = (User) c1.newInstance();
        System.out.println(user);

        //通过构造器来构造一个对象
        Constructor constructor = c1.getDeclaredConstructor(int.class);
        User user2 = (User) constructor.newInstance(12);
        System.out.println(user2);

        //通过反射调用普通方法
         User user3 = (User) c1.newInstance();
        Method setName = c1.getMethod("setName", String.class);
        setName.invoke(user3,"kakaka");
        System.out.println(user3.getName());

        //通过反射操作属性
        System.out.println("=======================");
        User user4 =(User) c1.newInstance();
        Field name = c1.getDeclaredField("name");

        //设置私有name是可接近的,关闭代码的安全检测
        name.setAccessible(true);
        name.set(user4,"xkkk2");
        System.out.println(user4.getName());
    }
}

 setAccessible

Method Field Constructor 都是有这个方法的,作用是启动和禁止访问安全检查的开关。

true为反射的对象在使用时取消访问检查 false则实施访问检查

如果代码中频繁使用反射,设置为true。使得原本无法访问的私有成员也可以访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 之 反射 (结合Class理解) 的相关文章

随机推荐

  • Redis的面试题

    1 为什么使用Redis做缓存 redis具有高性能和高并发的特点 redis为什么具有高性能 或者说redis为什么快 1 首先redis的数据存在内存中 所以比存储磁盘上的数据库快 2 其次redis本身使用了高效的数据结构 redis
  • win11WiFi驱动如何下载 windows11WiFi驱动下载的步骤方法

    Win11wifi驱动如何下载 现在很多用户都安装了最新的Win11系统 但是在使用的时候发现电脑原有的无线网卡驱动不匹配 需要安装win11wifi驱动 不知道win11wifi驱动下载安装方式 下面小编就教下大家win11无线网卡驱动下
  • Java中Callable接口(多线程实现的第三种办法)

    实现多线程程序的步骤 1 自定义类实现Callable接口 重写接口中的run方法 V call throws Exception 其余两种方法run 没有返回值 2 创建线程池对象 Executors 里面的那个方法 返回的是Execut
  • m1 使用anaconda安装tensorflow

    anaconda已经支持m芯片了 所以直接在官网下载 创建conda环境 conda create n tensorflow learn python 3 8 conda activate tensorflow learn 按照tensor
  • 十大新兴前端框架大盘点

    十大新兴前端框架大盘点 2019年在整体上 前端的主流框架没有太大的变化 业务代码仍由三大框架 React Vue Angular 所主宰着 打包工具一般仍使用webpack Rollup js 状态管理器还是Redux MobX 但随着这
  • 腾讯云视频上传问题总结

    使用腾讯云提供java sdk4 4 MultipartUploadVodFile使用此接口 分片上传 分片大小设置1024 1024 20会被腾讯服务器拒绝 无法上传 目前设置为1024 1024 5 最小分片设置为1024 512 域名
  • adaboost原理(包含权重详细解释)

    1 1 Adaboost是什么 AdaBoost 是英文 Adaptive Boosting 自适应增强 的缩写 由Yoav Freund和Robert Schapire在1995年提出 它的自适应在于 前一个基本分类器分错的样本会得到加强
  • 为什么说区块链的性能严重不足?

    现如今 性能过低是当前区块链技术面临的主要挑战之一 区块链的性能指标主要包括交易吞吐量和延时 交易吞吐量表示在固定时间能处理的交易数 延时表示对交易的响应和处理时间 在实际应用中 需要综合两个要素进行考察 只使用交易吞吐量而不考虑延时是不正
  • STM32CubeMX学习——旋转编码器模块

    前言 雨打灯难灭 风吹色更明 若飞天上去 定作月边星 李白 咏萤火 一 旋转编码器介绍 旋转编码器是一种可以左右旋转 同时也可以按下 也可以按下旋转的器件 通过左右旋转对应着内部不同开关的导通 同时按下也可以旋转 由此看来旋转编码器可以实现
  • 计算机msvcp120.dll丢失的解决方法

    计算机msvcp120 dll丢失的解决方法 相信困扰着不少小伙伴 msvcp120 dll系统文件是电脑重要的文件 丢失或者被损坏的话 很多软件跟游戏都会无法运行 需要怎么修复呢 小编今天就把教程分享给大家 修复教程如下 首先是打开电脑浏
  • el-dialog 对话框显示怎么往上调一调 或者往下调调显示

  • Python股票历史数据预处理(一)

    Python股票历史数据预处理 一 在进行量化投资交易编程时 我们需要股票历史数据作为分析依据 下面介绍如何通过Python获取股票历史数据并且将结果存为DataFrame格式 处理后的股票历史数据下载链接为 http download c
  • layui中form.val()使用,不起作用的原因

    在使用layui中 form表单数据的获取和渲染时绕不开的话题 在layui中form数据的渲染有个方法 form val 但是在使用的过程中很容易陷入误区 下面我就来为大家介绍如何解决form val 不显示的问题 let obj tit
  • error An unexpected error occurred: “https://registry.yarnpkg.com/axios: con 解决方案

    error An unexpected error occurred https registry yarnpkg com axios con 今天用在跑一个项目的时候发现了这个错误 看着像是网络连接不上 发现这里是用的Dokcerfile
  • 向ACCESS中的"时间/日期"字段中插入DateTime.Now时出现“标准表达式中数据类型不匹配。”错误的解决办法

    在使用下面的代码向Access数据库中添加数据的时候 如果是日期字段 则会出现 标准表达式中数据类型不匹配 的错误 这可能是C 中的日期类型无法直接转换成Access中的日期类型OleDbType DBDate所致 string Conne
  • Maximum Sum Subarray of Size K--滑动窗口题型

    滑动窗口题型 滑动窗口类型的题目经常是用来执行数组或是链表上某个区间 窗口 上的操作 比如找最长的全为1的子数组长度 滑动窗口一般从第一个元素开始 一直往右边一个一个元素挪动 当然了 根据题目要求 我们可能有固定窗口大小的情况 也有窗口的大
  • 电脑副业能做什么?一台电脑能做的副业

    现在很多人都想在工作之余开展一些副业 特别是今年经济形势不好 更让很多人明白了 有一份副业的重要性 这样可以在自己没有工作的时候还能有一份收入 那么有哪些副业可以在网络上做呢 如果你只有一台电脑的话 可以做哪些副业呢 1 自媒体 悟空问答或
  • Docker常用命令超细介绍,Java校招面试指南

    2 3 docker pull 前面我们介绍了 search命令可以从docker hub上搜索到相关的镜像 接下来看看我们通过docker pull 来下载镜像 docker pull 镜像名称 TAG 通过镜像加速下载还是比较快的 2
  • 解决下载github-production-release-asset-2e65be.s3.amazonaws.com上release文件慢的问题

    1 问题 去github下载BloomRPC工具进行测试grpc 果然一如既往的慢 想到把github转到码云进行下载 奈何我要下载的是release的文件 有两个代下地址 GitHub代下载服务 永久免费 这个最近貌似挂了 试试下面那个
  • java 之 反射 (结合Class理解)

    反射机制使静态语言java变为准动态语言 Reflection 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息 并能直接操作任意对象的内部属性及方法 反射方式 实例化对象 getClass 方法 得到完整的