【Java 反射】对于获取修饰符需要知道的事

反射

修饰符返回值

虚拟机规范表4.1、4.4、4.5和4.7中的访问修饰符标志常量

修饰符类型修饰符名称标志值(十进制)标志值(十六进制)
PUBLIC公共10x00000001
PRIVATE私有20x00000002
PROTECTED保护40x00000004
STATIC静态80x00000008
FINAL不可变160x00000010
SYNCHRONIZED同步320x00000020
VOLATILE可变640x00000040
TRANSIENT非序列化1280x00000080
NATIVE本地2560x00000100
INTERFACE接口5120x00000200
ABSTRACT抽象10240x00000400
STRICT严格浮点运算20480x00000800

源码出处:package java.lang.reflect.Modifier;

虚拟机规范表4.1、4.4、4.5和4.7中的访问修饰符标志常量

/** Access modifier flag constants from tables 4.1, 4.4, 4.5, and 4.7 of* <cite>The Java&trade; Virtual Machine Specification</cite>*//*** The {@code int} value representing the {@code public}* modifier.*/
public static final int PUBLIC           = 0x00000001;/*** The {@code int} value representing the {@code private}* modifier.*/
public static final int PRIVATE          = 0x00000002;/*** The {@code int} value representing the {@code protected}* modifier.*/
public static final int PROTECTED        = 0x00000004;/*** The {@code int} value representing the {@code static}* modifier.*/
public static final int STATIC           = 0x00000008;/*** The {@code int} value representing the {@code final}* modifier.*/
public static final int FINAL            = 0x00000010;/*** The {@code int} value representing the {@code synchronized}* modifier.*/
public static final int SYNCHRONIZED     = 0x00000020;/*** The {@code int} value representing the {@code volatile}* modifier.*/
public static final int VOLATILE         = 0x00000040;/*** The {@code int} value representing the {@code transient}* modifier.*/
public static final int TRANSIENT        = 0x00000080;/*** The {@code int} value representing the {@code native}* modifier.*/
public static final int NATIVE           = 0x00000100;/*** The {@code int} value representing the {@code interface}* modifier.*/
public static final int INTERFACE        = 0x00000200;/*** The {@code int} value representing the {@code abstract}* modifier.*/
public static final int ABSTRACT         = 0x00000400;/*** The {@code int} value representing the {@code strictfp}* modifier.*/
public static final int STRICT           = 0x00000800;

推荐写法

注意:当有多个不同种类的修饰符时,实际返回值为多个修饰符的值相加的和

比如方法:

//简单示例方法
public synchronized String getName() {return name;
}
//获取方法修饰符(打印的主要代码)
System.out.println(method.getModifiers());

这个方法的修饰符返回值就是 33,即 public + synchronized : 1 + 32 = 33

直接获取修饰符返回值不直观,我们更推荐这样获取修饰符:

//推荐获取方法修饰符的写法
System.out.println(Modifier.toString(method.getModifiers()));//控制台输出
public synchronized

方法源码出处:package java.lang.reflect.Modifier;

public static String toString(int mod) {StringBuilder sb = new StringBuilder();int len;if ((mod & PUBLIC) != 0)        sb.append("public ");if ((mod & PROTECTED) != 0)     sb.append("protected ");if ((mod & PRIVATE) != 0)       sb.append("private ");/* Canonical order */if ((mod & ABSTRACT) != 0)      sb.append("abstract ");if ((mod & STATIC) != 0)        sb.append("static ");if ((mod & FINAL) != 0)         sb.append("final ");if ((mod & TRANSIENT) != 0)     sb.append("transient ");if ((mod & VOLATILE) != 0)      sb.append("volatile ");if ((mod & SYNCHRONIZED) != 0)  sb.append("synchronized ");if ((mod & NATIVE) != 0)        sb.append("native ");if ((mod & STRICT) != 0)        sb.append("strictfp ");if ((mod & INTERFACE) != 0)     sb.append("interface ");if ((len = sb.length()) > 0)    /* trim trailing space */return sb.toString().substring(0, len-1);return "";
}

补充:源码中定义的其他常量信息

未(尚未)在公共API中公开的位,因为它们对字段和方法有不同的含义,并且没有区分这类中两者的方法,或者因为它们不是Java编程语言关键字

// Bits not (yet) exposed in the public API either because they
// have different meanings for fields and methods and there is no
// way to distinguish between the two in this class, or because
// they are not Java programming language keywords
static final int BRIDGE    = 0x00000040;
static final int VARARGS   = 0x00000080;
static final int SYNTHETIC = 0x00001000;
static final int ANNOTATION  = 0x00002000;
static final int ENUM      = 0x00004000;
static final int MANDATED  = 0x00008000;

VARARGS

在Java中,varargs是一种修饰符,它允许方法接受数量可变的参数。这是通过在参数列表中最后一个参数类型后面加上省略号(...)实现的。

VARARGS修饰符在Java中并不存在,这可能是你误解了varargs的概念。在Java中,varargs修饰符是通过在方法参数列表中的最后一个参数类型后面加上...来实现的。

以下是一个使用varargsJava方法的例子:

public class VarargsExample {public static void printVarargs(String... varargs) {for (String str : varargs) {System.out.println(str);}}public static void main(String[] args) {printVarargs("Hello", "World", "Java");}
}

在上述代码中,printVarargs方法接受一个可变参数,即一个字符串数组。在main方法中,我们调用printVarargs方法并传递了三个字符串作为参数。

注意:varargs只能应用于最后一个参数,而且方法中只能有一个varargs参数。

SYNTHETIC

SYNTHETICJava字节码中的一个修饰符,它表示该字段或方法并非由用户代码显式声明,而是由编译器自动生成的。例如,内部类的引用到外部类的实例会被标记为SYNTHETIC字段。

如果你在查看Java类文件时看到带有SYNTHETIC标记的字段或方法,通常意味着它是由编译器自动生成的,并不需要用户手动编写。

解决方法:

  1. 如果你在分析或者调试代码时遇到了带有SYNTHETIC标记的成员,可以理解这些成员是由编译器添加的,通常不需要用户干预。
  2. 如果你正在使用反射API来访问这些成员,并且想要确保只访问用户定义的字段和方法,可以通过检查成员的isSynthetic()方法来过滤这些自动生成的成员。
  3. 如果你是Java字节码的修改者或生成者,确保不要错误地生成了SYNTHETIC标记,除非你有特殊的需求需要让这部分代码对编译器可见。

MANDATED

MANDATEDJava中用于指示JVM如何使用特定的Java类或接口的修饰符。这个修饰符通常与JNI(Java Native Interface)相关的代码或者Java平台的内部类和接口有关。它是一个由JVM内部使用的标志,并不是开发者直接可控制或使用的。

如果你在代码中看到了 MANDATED 关键字,很可能是因为你正在查看的是Java的内部类或接口,或者是由JNI代码生成的类。

如果你遇到了包含 MANDATED 关键字的错误,通常这意味着你正在尝试访问或操作一个不应该直接被用户代码访问或操作的Java类。解决这类问题通常需要你避免直接操作这些内部类或接口。

如果你是在阅读Java的源码或者JVM的实现时遇到了 MANDATED 关键字,你可以理解为这个类或接口是被JVM的某些特定部分或是JNI调用的,而不是普通的用户代码。

如果你需要进一步的帮助来理解如何处理特定的 MANDATED 修饰符的问题,你需要提供更多的上下文信息,例如,你正在运行的具体代码、错误信息的完整内容,或者你正在使用的Java版本和JVM实现。

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

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

相关文章

堆排序---C语言

堆排序详解&#xff1a;点这里。 使用向下调整算法实现堆排序&#xff0c;完整代码 #include<stdio.h>void Swap(int* p1, int* p2) {int* tmp *p1;*p1 *p2;*p2 tmp; }void Print(int* arr, int n) {for (int i 0; i < n; i){printf("%d ", arr[i]);}…

【16】编写shell-批量导入mysql的sql语句

说明: 1、定时备份mysql的表sql语句,并且保留30天文件夹,会定期删除30天前的文件夹 2、根据业务场景需要,需要定时将表数据导出sql语句 3、定时将sql语句推送到另外指定的数据库中 4、编写shell脚本是实现批量导入mysql的sql语句 一、Shell脚本备份mysql表数语句 # !/bin/…

大语言模型的sft

https://zhuanlan.zhihu.com/p/692892489https://zhuanlan.zhihu.com/p/6928924891.常见的sft的开发流程 a.根据业务场景调整提示词;越详细越好,不要让模型理解歧义,拆分。 b.尝试闭源和开源,以评估LLM能够解决这类场景问题。 c.准备数据,包括多个子任务。 d.训练上线…

电脑提示缺失iUtils.dll文件怎么办,分享几种靠谱的解决方法

在现代科技发展迅猛的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;随着使用时间的增长&#xff0c;电脑也会出现一些问题&#xff0c;其中之一就是开机时弹出窗口提示找不到iUtils.dll文件。这个问题可能会给用户带来困扰和不便&#xff0c;…

Maven下载、安装、配置与使用教程

Maven下载、安装、配置与使用教程 目录 简介下载与安装配置使用示例总结 1. 简介 Maven是一个项目管理工具&#xff0c;主要用于Java项目。它可以自动化构建过程&#xff0c;包括编译、测试、打包和部署等。Maven使用POM&#xff08;Project Object Model&#xff09;文件来…

Python的登录注册界面跳转汽车主页面

1.登录注册界面的代码&#xff1a; import tkinter as tk from tkinter import messagebox,ttk from tkinter import simpledialog from ui.car_ui import start_car_ui# 设置主题风格 style ttk.Style() style.theme_use("default") # 可以根据需要选择不同的主题…

切莫被人工智能的洪流吞噬

切莫被人工智能的洪流吞噬 当今社会似乎正在被“人工智能”的概念淹没&#xff0c;各行各业也都期望能与其挂钩&#xff0c;彷佛这就是新世代下的灵药&#xff0c;有人把这一现象称为“旧互联网时代的新革命”。但是我们&#xff0c;这一现象的缔造者&#xff0c;又处于这洪流…

Linux基础指令文件管理004

本章主要讲述如何查找文件。 操作系统&#xff1a; CentOS Stream 9 操作步骤&#xff1a; 指令find [rootlocalhost a]# find -name "*.txt"查找当前目录下的所有.txt文件 ./b/3.txt ./b/4.txt ./1.txt[rootlocalhost a]# find . #查找文件 . ./b ./b/c ./b/3.t…

360数字安全:2024年2月勒索软件流行态势分析报告

勒索软件传播至今&#xff0c;360反勒索服务已累计接收到数万勒索软件感染求助。随着新型勒索软件的快速蔓延&#xff0c;企业数据泄露风险不断上升&#xff0c; 勒索金额在数百万到近亿美元的勒索案件不断出现。勒索软件给企业和个人带来的影响范围越来越广&#xff0c;危害性…

【Android面试八股文】Android两种序列化方式Serialzable和Parcelable有什么区别?为什么Intent传递对象需要序列化?

文章目录 序列Parcelable,Serializable的区别?这道题想考察什么?考察的知识点考生应该如何回答Bunder传递对象为什么需要序列化?Serializable,简单易用基本使用serialVersionUIDParcelable , 速度至上Parcel区别测试速度对比测试方法结果总结序列Parcelable,Serializable的…

BOT算不算作弊

https://arxiv.org/abs/2406.04271 1. 引言 介绍大型语言模型&#xff08;LLMs&#xff09;在推理任务中的局限性。 概述现有推理方法的分类和局限性&#xff1a;单次查询推理和多查询推理。 提出Buffer of Thoughts (BoT) 框架&#xff0c;旨在提高LLMs的推理准确性、效率和…

npm安装依赖过慢

今天在使用npm安装taro框架的依赖时&#xff0c;速度慢到吐血&#xff0c;使用了淘宝镜像源依然很慢&#xff0c;安装一个多小时没反应&#xff0c;最后清理了缓存再次安装速度就快很多了&#xff0c;因此解决方法大致有两种&#xff1a; 使用淘宝镜像源 原域名&#xff1a; ht…

计算机网络--计算机网络概念

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 0.计算机网络简介 0.2 计算机网络的功能简介 数据通信(连通性)资源共享&#xff1a; 软件硬件数据 分布式处理 多台计算机各自承担同…

项目-双人五子棋对战:匹配模块的实现(4)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 在上一篇中, 我们已经讲到了匹配模块中前后端的接口约定, 也讲到了前后端它们是怎么完成发送请求, 接收请求, 处理响应, 返回响应这个过程的. 在这一篇中, 我们将对匹配模块用到的一些组件, 进行讲解. 后端代码 匹配器…

【Linux取经路】网络套接字编程——初识篇

文章目录 一、端口号1.1 认识端口号1.2 端口号 VS 进程 PID 二、认识 TCP 协议三、认识 UDP四、网络字节序列五、socket 编程接口5.1 常用 API5.2 sockaddr 结构 六、结语 一、端口号 网络通信的本质是应用层软件进行数据的发送和接受&#xff0c;软件在启动之后&#xff0c;本…

spring boot中常用的多线程案例

在Spring Boot中&#xff0c;多线程的应用场景广泛&#xff0c;尤其是在需要提高系统并发处理能力和资源利用率的场景下。以下是一些Spring Boot中常用的多线程案例&#xff0c;并结合参考文章中的相关数字和信息进行说明&#xff1a; 1.异步任务处理 案例描述: 在Spring Bo…

安徽京准 NTP时钟同步服务器具体配置方法是什么?

安徽京准 NTP时钟同步服务器具体配置方法是什么&#xff1f; 安徽京准 NTP时钟同步服务器具体配置方法是什么&#xff1f; 可以使用特权终结点 (PEP) 来更新 Azure Stack Hub 中的时间服务器。 使用可解析为两个或更多个 NTP&#xff08;网络时间协议&#xff09;服务器 IP 地…

网络安全快速入门(十五)(下)手动创建用户及su,sudo命令

15.8 序言 前面我们已经大概了解了创建用户一些相关文件&#xff0c;接下来我们来手动创建用户&#xff0c;话不多说&#xff0c;我们直接开搞&#xff01;&#xff01;&#xff01; 15.9 手动创建用户&#xff1a; 一般来讲&#xff0c;我们创建用户通过useradd和passwd命令来…

Go每日一库之rotatelogs

介绍 Golang的rotatelogs库是一个用于日志轮转&#xff08;log rotation&#xff09;的库。日志轮转是一种常用的日志管理策略&#xff0c;它允许开发者将日志按照一定规则分割成多个文件&#xff0c;以便于管理和分析。通过使用rotatelogs库&#xff0c;开发者可以方便地实现…

python数据分析-心脏衰竭分析与预测

研究背景 人的心脏有四个瓣膜&#xff0c;主动脉银、二尖、肺动脉和三尖源 不管是那一个膜发生了病变&#xff0c;都会导致心脏内的血流受到影响&#xff0c;这就是通常所说的心脏期膜病&#xff0c;很多是需要通过手术的方式进行改善的。随着人口老龄化的加剧,&#xff0c;心…