Java 我们可以对运行时返回的对象做一些更改吗

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

是否有可能在运行时对对象进行一些更改

我的问题是有一个类返回logger的实例。该类只包含一个返回记录器的公共方法。下面是课堂

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设置日志记录级别可能是个坏主意。通常的做法是使用日志配置文件。。。大多数人都希望在那里找到这种东西。