Java 反射基础

概述

Java反射(Reflection)是Java编程语言的一个特性,它允许在运行时对类、接口、字段和方法进行动态查询和操作。反射提供了一种在运行时查看和修改程序行为的能力,这通常用于实现一些高级功能,如框架、ORM(对象关系映射)工具、IDE(集成开发环境)等。 

1. 反射基础

1.1. 反射的用途 

Java反射角度简单理解spring IOC容器-CSDN博客

1.2.获取class对象的三种方式

反射是基于class对象来操作的,获取class对象的三种方式如下:

  • Class.forName("全类名") --> 对应类在源码阶段
    /** 该方法最常使用* 由于编译时无法确定(运行时才能确认)该class object是一个什么类的对象,故而用?代替* 使用该方法,会立即触发类的初始化,类的静态初始化块会被执行。* 也就是静态代码块在new 实例化对象之前就已经加载了*/
     Class<?> clazz = Class.forName("com.mycompany.myreflect.Student");System.out.println(clazz);
  • 类名.class --> 对应类在加载阶段
    /*       第二种方法一般是当做参数进行传递
    *      如: synchronized(Student.class)
    */
    Class<Student> clazz = Student.class;
    System.out.println(clazz);
  • 对象.getClass --> 对应类在运行阶段
    /*这种方法 当我们已经有这个类的对象时,才可以使用*/
    Student s = new Student();Class<? extends Student> clazz = s.getClass();System.out.println(clazz);

更多理解可参考:Java 类加载和实例化对象的过程-CSDN博客 

1.3. 反射的基本API

Java反射API主要位于java.lang.reflect包中,包括以下几个核心类:

  • Class:表示类、接口、数组类、基本数据类型、以及void的Class对象。
  • Field:表示类的成员变量(包括实例变量和类变量)。
            Field[] fieldsType1 = clazz.getFields();//getFields 可以获得自己及父类(可以递归获得父类的父类的)的公共字段,不可以获得自己的或父类的私有字段for (Field field : fieldsType1){System.out.println(field);}System.out.println("------------------------------");// getDeclaredFields 可以获取自己的所有字段(私有和共有),但是不能获得父类的任何字段Field[] fieldsType2 = clazz.getDeclaredFields();for (Field field : fieldsType2){System.out.println(field);}System.out.println("------------------------------");// 获取父类的所有构造方法Field[] fieldsParentsAll = clazz.getSuperclass().getDeclaredFields();for (Field field : fieldsParentsAll){System.out.println(field);}
  • Method:表示类的方法。
            Method[] methods = clazz.getMethods();Method[] methods1 = clazz.getDeclaredMethods();Method method = clazz.getMethod("getName");
    //获取特定方法,括号内是方法名,入参类型Method method1 = clazz.getMethod("functionA",String.class);
    //获取方法的修饰符对应的值
    System.out.println("method modifiers:"+method.getModifiers());
    //执行静态方法
    method.invoke(null);
    //执行非静态方法
    method1.invoke(student);
  • Constructor:表示类的构造方法。
    // 返回所有公共构造方法对象的数组     Constructor<?>[] constructors1  = clazz.getConstructors();// 返回所有构造方法对象的数组     Constructor<?>[] constructors2 = clazz.getDeclaredConstructors();// 返回单个特定公共构造方法对象,括号内的是该构造方法的参数类型Constructor<Student> constructor3 = (Constructor<Student>);// 返回单个特定构造方法对象,括号内的是该构造方法的参数类型Constructor<Student> constructor4 = (Constructor<Student>); 
  • Annotation: 获取注解
         Annotation[] annotations = clazz.getAnnotations();Annotation[] annotations2 = clazz.getDeclaredAnnotations();Annotation annotation = clazz.getDeclaredAnnotation(MyAnnotation.class);Annotation annotation2 = clazz.getAnnotation(MyAnnotation.class);
     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊开店详细教程(6)- 获得商品的评分

1. 为什么要参加 VINE计划 用户在浏览一个新上架的商品时&#xff0c;通常会参照以往买家的对商品的评论&#xff0c;如果你是新全的商品可能没有任何评论信息&#xff0c;这可以会让一部分用户对购买产品有所顾虑&#xff0c;参加亚马逊Vine计划能够帮助新产品快速获得高质量…

vue实现esc关闭div弹窗的自定义指令

弹窗是 div 实现的&#xff08;非el-dialog&#xff09;,效果&#xff1a;按下esc&#xff0c;关闭弹窗 directive/divEscClose/divEscClose.js export default {bind: function (el, binding, vnode) {let keydownHandler; ​const closeModal () > {if (typeof binding.…

【MySQL精通之路】SQL优化(1)-查询优化

SQL优化方案主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-CSDN博客 SELECT查询优化&#xff1a; 以下优化都由MySQL查询优化器自动进行了处理。我们了解的过程中需要知道我们如何编写SQL以使优化器可以优化我们的查询语句。 之所以分成多博客发布&#xff0c;主要是为了…

2024年山东省安全员C证证考试题库及山东省安全员C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员C证证考试题库及山东省安全员C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

【Spring MVC】_SpringMVC项目返回数据

目录 1. 注解使用示例 1.1 使用Controller注解 1.2 使用RestController注解 1.3 使用Controller与ResponseBody注解 2. 关于ResponseBody注解 前文已经介绍过使用Controller注解向前端返回一个HTML页面&#xff0c;接下来将介绍向前端返回数据。 关于Controller和RestCon…

QT Qstring转QJson转QbyteArray

QT5.15 QT Qstring转QJson //读取json格式文件 // QByteArray json http_recv_str.toLatin1();//字符串转字节 QByteArray json http_recv_str.toUtf8().data(); //信息带中文&#xff0c;则需要toUtf8() //QByteArray json http_recv_str.toLocal8Bit().data();//…

Volatile的内存语义

1、volatile的特性 可见性&#xff1a;对一个volatile变量的读&#xff0c;总能够看到任意一个线程对这个volatile变量的写入。 原子性&#xff1a;对任意单个volatile变量的读/写具有原子性&#xff0c;但类似于volatile这种复合操作不具有原子性。 接下来我们用程序验证。…

独享IP是原生IP吗?

原生IP&#xff1a; 原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中…

设置height:100%不生效的原因

之前网课案例总是不屑于去看&#xff0c;因为总觉得太花时间&#xff0c;但是不可否认的是&#xff0c;认真去看还是会有收获的&#xff0c;而且常有意外收获 昨天在看实现动画效果的综合案例中&#xff0c;意外解决了我长久以来的一个疑问&#xff1a;为什么给元素设置height…

java在类的定义中创建自己的对象?

当在main方法中新建自身所在类的对象&#xff0c;并调用main方法时&#xff0c;会不断循环调用main方法&#xff0c;直到栈溢出 package com.keywordStudy;public class mainTest {static int value 33;public static void main(String[] args) throws Exception{String[] sn…

Python并发编程:多线程

前序博客中已经介绍了基于多进程的并发编程&#xff0c;本篇主要介绍基于多线程的并发编程。 1 全局解释锁 1.1 定义 全局解释锁(Global Interpreter Lock&#xff0c;简称GIL)是Python(特别是CPython)解释器中的一个机制&#xff0c;这个机制会限制同一时间只有一个线程执行P…

啥?题目是认真的么?啥大模型开源还是闭源,这就是个驳论!

开源大模型与闭源大模型&#xff0c;你更看好哪一方&#xff1f; 简介&#xff1a;评价一个AI模型“好不好”“有没有发展”&#xff0c;首先就躲不掉“开源”和“闭源”两条发展路径。对于这两条路径&#xff0c;你更看好哪一种呢&#xff1f; 其实我认为2者之间压根没啥好纠…

Java队列简介

在现代应用程序开发中&#xff0c;队列是一种常见且强大的数据结构&#xff0c;用于存储和管理待处理的任务序列。结合MySQL数据库&#xff0c;我们可以利用队列实现任务的持久化存储与高效处理。本文将通过四个案例&#xff0c;详细介绍如何在Java中使用队列&#xff0c;并结合…

面了字节大模型算法岗,太难了。。。

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

PCM和QAM

PCM&#xff08;脉冲编码调制&#xff09;和QAM&#xff08;正交振幅调制&#xff09;是两种不同的信号调制技术&#xff0c;它们在通信系统中有着不同的应用和特点。 PCM&#xff08;脉冲编码调制&#xff09; 概述 PCM是一种数字信号处理技术&#xff0c;用于将模拟信号转…

ClickHouse实战处理(一):MergeTree表引擎

MergeTree作为家族系列最基础的表引擎&#xff0c;主要有以下特点&#xff1a; 存储的数据按照主键排序&#xff1a;创建稀疏索引加快数据查询速度。支持数据分区&#xff0c;可以通过PARTITION BY语句指定分区字段。支持数据副本。支持数据采样。 一、MergeTree分类和建表参…

[emailprotected](2)核心概念-JSX

目录 1&#xff0c;什么是 jsx2&#xff0c;空标签3&#xff0c;通过大括号使用 js4&#xff0c;防止注入攻击5&#xff0c;元素的不可变性 官方文档 1&#xff0c;什么是 jsx Facebook 起草的 js 扩展语法。本质上是 js 对象&#xff0c;会被 babel 编译&#xff0c;最终转换…

军队仓库管理系统|DW-S301系统特点

部队仓库管理系统DW-S301系统通过数据采集、互联网和物联网技术&#xff0c;实现数字化智能管控&#xff0c;以提高军用物资的仓储准确率和流转率&#xff0c;缩短周转时间&#xff0c;降低库存成本&#xff0c;也有助于消除生产过程中的不确定性。 系统功能&#xff1a;通过部…

web学习笔记(五十六)

目录 1.绑定类名和style 1.1 绑定类名 1.1.1 绑定单个类名 1.1.2 绑定多个类名 1.2 style相关知识 2. vue的响应式原理 3. v-once 4.本地搭建Vue单页应用 4.1 安装Vue脚手架 4.2 安装对应的包文件 4.3 运行项目 1.绑定类名和style 1.1 绑定类名 1.1.1 绑定单个类名…

openstack报错:openstack volume service list The server is currently unavailable.

openstack报错&#xff1a; [rootcontroller ~]# openstack volume service list The server is currently unavailable. Please try again at a later time.<br /><br /> The Keystone service is temporarily unavailable.(HTTP 503)操作&#xff1a;做cinder 报…