Java 我们可以对运行时返回的对象做一些更改吗
是否有可能在运行时对对象进行一些更改 我的问题是有一个类返回logger的实例。该类只包含一个返回记录器的公共方法。下面是课堂Java 我们可以对运行时返回的对象做一些更改吗,java,object,runtime,Java,Object,Runtime,是否有可能在运行时对对象进行一些更改 我的问题是有一个类返回logger的实例。该类只包含一个返回记录器的公共方法。下面是课堂 public class LoggerManager { public Logger getLogger(String FQCN) { Logger logger = Logger.getLogger(FQCN); logger.setLevel(Level.INFO); return logge
public class LoggerManager {
public Logger getLogger(String FQCN) {
Logger logger = Logger.getLogger(FQCN);
logger.setLevel(Level.INFO);
return logger;
}
}
现在如果我想在运行时更改返回的对象
这意味着设置为level INFO的logger对象,我想将其更改为DEBUG。。在程序执行期间,仅当在特定时间调用此代码时。。。在任何地方都不更改代码。。像这样的事情
logger.setLevel(Level.DEBUG);
我可以通过任何方式实现这一点吗
因为这个类在我的代码中无处不在。。大约1000个位置,不需要更改代码…我可以通过某种方式实现这一点
是否有可能在运行时对对象进行一些更改
是的,您可以对从方法调用返回的对象进行更改
很难理解你想做什么。如果在返回的记录器上设置调试级别,则应为正在运行的vm中请求具有相同FQCN
参数的logger
的所有位置设置调试级别 您可以在通话前设置所需的值,然后再恢复正常。
Somme日志类允许这样做
I can't be specific here because your didn't say exactly what your Logger class is (Log4j ?).
这个logger类似乎被称为静态方法。
因此,如果您的系统中有任何线程(例如,如果使用Tomcat,或使用后台线程),修改级别是不安全的(它将对您进行修改,但对所有线程也是如此)
但是,解决问题的通常方法是不改变级别。
如果希望显示日志,请执行以下任一操作:
以显示的级别登录
选择不同的记录器(每个记录器可配置为特定级别)
我认为您是在询问是否可以在不更改类的情况下更改getLogger(String)
方法的行为。简单的答案是“不,你不能”
您可以尝试以下几个技巧:
- 在应用程序的类路径中,将不同版本的类放在当前版本之前
- 在加载之前,使用BCEL或其他方法修改类字节码
然而,这两项都相当于改变了类
我认为最简单的方法是修改LogManager
类,以便生成具有不同级别的记录器。稍加考虑,您应该能够想出一个不会显著影响代码库其余部分的解决方案
然而,设置日志记录级别的正常方法是使用配置文件,而不是在应用程序中显式调用setLevel
,这一点也毫无意义。可以使用AOP来完成,但它是经过编译的。AOP允许您处理方法调用之前和之后
我不知道为什么你必须在你的单个项目中获得超过1000个位置。你们有超过1000门课吗?通常,每个类只需要调用一次。我还将更改代码并重新设计此方法 这篇文章我读了三遍,我还是不明白你的问题。你能详细解释一下吗?@amir:我已经更新了,,,请告诉我你现在是否能理解???。你能解释一下为什么这不起作用吗?不明白(使用配置文件…或[仅]DI)@pst-使用DI设置日志记录级别可能是个坏主意。通常的做法是使用日志配置文件。。。大多数人都希望在那里找到这种东西。