检测Java匿名内部类对象

检测Java匿名内部类对象,java,bytecode,instrumentation,Java,Bytecode,Instrumentation,因此,考虑到以下代码: public MyInterface getMyInterface() { return new MyInterface() { public SomethingElse getSomethingElse() { // .... } } } ... MyInterface obj = getMyInterface(); 是否有方法在该obj上插入对getSomethingElse()的调用?去做一些

因此,考虑到以下代码:

public MyInterface getMyInterface() {
    return new MyInterface() {
        public SomethingElse getSomethingElse() {
           // ....
        }
    }
}

...
MyInterface obj = getMyInterface();
是否有方法在该
obj
上插入对getSomethingElse()的调用?去做一些字节码修改什么的


我有生产代码在那里,在不同的情况下(称之为“设计时”),我想添加一些跟踪/日志记录和这样的代码来帮助进行故障排除和分析。性能对于生产案例至关重要,因此我希望在不增加额外跟踪/日志记录开销的情况下保留它。但是在设计时的情况下,我想要所有的跟踪信息。

如果您想在开发中打开日志记录,最简单的方法是

if(LOGGER.isDebugEnabled())
   LOGGER.debug("my debug message");
加在头顶上的是亚纳秒,所以即使你在一个每纳秒都有计数的系统上工作,这仍然是最好的模式


你可以和我一起上课

 Class.forName("package.OuterClass$NNN");

您需要调用一个构造函数来获取外部类的实例。

如果您想在开发中打开日志记录,最简单的方法是

if(LOGGER.isDebugEnabled())
   LOGGER.debug("my debug message");
加在头顶上的是亚纳秒,所以即使你在一个每纳秒都有计数的系统上工作,这仍然是最好的模式


你可以和我一起上课

 Class.forName("package.OuterClass$NNN");

您需要调用一个构造函数来获取外部类的实例。

这听起来是一个很好的使用实例


您可以简单地将日志记录/跟踪代码应用于测试环境中所需的任何方法,并在转入生产环境时将其删除。

这听起来是一个很好的使用案例


您可以简单地在测试环境中的任何方法周围应用日志记录/跟踪代码,并在进入生产环境时将其删除。

是的,可以按照您的要求执行,但肯定有更好的方法来实现它-最明显的是创建MyInterface的默认实现,然后是它的一个“跟踪”子类,它在调用超类版本之前进行扩展和记录

如果插装是您唯一的选择,那么在设计时运行时,您可以使用java 5中的java代理启动项目,或者在java 6中的运行时向类路径添加java代理。看

要对类进行工具化,您可能需要使用类似的工具。步骤如下:

  • 在代理类中,实现java.lang.instrument.ClassFileTransformer
  • 在agentmain()或premain()方法中,转换类
  • 当收到对该方法的调用时,可以使用class.getInterfaces()检查该类是否实现了MyInterface
  • 或者,您可以检查其类.getEnclosuringClass()是否是编写/发现此代码的类
  • 如果类通过了这些健全性检查,那么创建一个类编写器,将日志添加到getSomethingElse()方法中。当您试图找出如何生成所需代码时,它会有很大帮助
  • 然后,在生产中,这些代码将不存在。在开发过程中,您将在环境中添加Java代理,这将启用调试

    同样,几乎可以肯定有更好的方法可以做到这一点,但是有充分的理由使用仪器,这是一个小型的速成课程


    希望这会有所帮助,

    是的,你可以按照你的要求去做,尽管肯定有更好的方法来完成它——最明显的方法是创建MyInterface的默认实现,然后创建一个“跟踪”子类,在调用超类版本之前对其进行扩展和记录

    如果插装是您唯一的选择,那么在设计时运行时,您可以使用java 5中的java代理启动项目,或者在java 6中的运行时向类路径添加java代理。看

    要对类进行工具化,您可能需要使用类似的工具。步骤如下:

  • 在代理类中,实现java.lang.instrument.ClassFileTransformer
  • 在agentmain()或premain()方法中,转换类
  • 当收到对该方法的调用时,可以使用class.getInterfaces()检查该类是否实现了MyInterface
  • 或者,您可以检查其类.getEnclosuringClass()是否是编写/发现此代码的类
  • 如果类通过了这些健全性检查,那么创建一个类编写器,将日志添加到getSomethingElse()方法中。当您试图找出如何生成所需代码时,它会有很大帮助
  • 然后,在生产中,这些代码将不存在。在开发过程中,您将在环境中添加Java代理,这将启用调试

    同样,几乎可以肯定有更好的方法可以做到这一点,但是有充分的理由使用仪器,这是一个小型的速成课程


    希望对您有所帮助,

    以下是您应该使用内部类的实例:。至于日志记录,我强烈建议您登录(只需在另一个线程上登录,这样您的应用程序就不会受到IO限制);它非常有助于w调试这里有一些应该使用内部类的实例:。至于日志记录,我强烈建议您登录(只需在另一个线程上登录,这样您的应用程序就不会受到IO限制);这对调试非常有帮助。这似乎没有回答关于如何插入/修改字节码的问题。是的,我以为你想知道如何创建字节码。间接回答了问题。检查调试开关只占创建对象所需时间的一小部分。这似乎没有回答有关如何插入/修改字节码的问题。是的,我以为您想知道如何创建它。间接回答了问题。检查调试开关只占创建对象所需时间的一小部分。