Java反射常见问题(一):java.lang.reflect.Field.set(null, value)的作用

1、Filed.set()方法的作用

// Field将指定对象参数上此对象表示的字段设置为指定的新值
void set(Object obj, Object value)

2、概述

今天在阅读源码的时候发现这样一行代码:

field.set(null, value);

在这里插入图片描述
真是奇了怪了,还能给null设置一个新值!

然后查看Field源码注释发现:如果Field是static的,JVM会忽略obj参数;所以在这种情况下入参可以为null。
在这里插入图片描述
最后,感叹一下,反射大法是真的强;当然鱼与熊掌不可兼得,效率就不言而喻了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下代码来临时修改 `log.isLoggable` 方法的返回值: ```java import java.lang.reflect.Field; import java.util.logging.Level; import java.util.logging.Logger; public class LogModifier { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Logger logger = Logger.getLogger("your_logger_name"); // 替换成您的日志记录器名称 Field field = Logger.class.getDeclaredField("handlers"); field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & ~java.lang.reflect.Modifier.FINAL); field.set(logger, null); logger.setLevel(Level.ALL); // 设置日志记录器级别为全部记录 // 替换成您希望的日志记录级别 int logLevel = Level.INFO.intValue(); // 这里设置为 INFO 级别 Field logLevelField = Logger.class.getDeclaredField("level"); logLevelField.setAccessible(true); logLevelField.set(logger, Level.parse(Integer.toString(logLevel))); // 执行您希望的操作,例如: logger.info("临时修改日志记录级别为 INFO"); // 恢复默认的日志处理器 logger.addHandler(new java.util.logging.ConsoleHandler()); } } ``` 请替换代码中的 `your_logger_name` 为您实际使用的日志记录器名称,并设置 `logLevel` 为您希望的日志记录级别(例如:Level.INFO)。 这段代码通过反射将 `handlers` 字段置为 null,然后设置日志记录器的级别为全部记录,并执行您希望的操作。请注意,这只是一种临时修改日志记录级别的方法,不会永久更改配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值