Изменить код во время выполнения для записи возвращаемых значений в Java? - PullRequest
1 голос
/ 19 октября 2011

Есть ли способ вставить код во время выполнения для регистрации возвращаемых значений, например, с помощью инструментария?

До сих пор мне удавалось вставить код при выходе из метода, но я бы хотел записать что-то вроде"метод foo вернул HashMap {1 -> 2, 2 -> 3}"

Я ищу общий подход, который также может работать, например, с классами java.io. *.(В общем, у меня не будет доступа к коду).

Я тоже пытался использовать собственный загрузчик классов, но возникает много трудностей, так как я не могу изменить java. * Classes.

Спасибоза помощь!Sergio

Ответы [ 4 ]

2 голосов
/ 19 октября 2011

Выезд BTrace . Это Java, и я верю, что он сделает то, что вы хотите.

1 голос
/ 19 октября 2011

Ну, так как вы ищете все, единственное, о чем я могу подумать, - это использовать агент машины.Агенты машины подключаются к низким уровням самой JVM и могут использоваться для мониторинга этих вещей.

Я не использовал DTrace, но, похоже, он сможет делать то, что вам нужно.Адам Левенталь написал хорошее сообщение в блоге об этом.Ссылка на DTrace в блоге не работает, но я уверен, что быстрый поиск, и вы найдете его.

1 голос
/ 19 октября 2011

Взгляните на Spring AOP, который достаточно мощный и гибкий. Чтобы начать с метода foo, вы можете применить к нему AfterReturning advice как:

@Aspect
public class AfterReturningExample {

  @AfterReturning(
    pointcut="package.of.your.choice.YourClassName.foo()",
    returning="retVal")
  public void logTheFoo( Object retVal ) {
    // ... logger.trace( "method 'foo' returned " + retVal ); // might need to convert "retVal" toString representation if needed
  }      
}

Синтаксис pointcut действительно гибкий, поэтому вы можете настроить таргетинг на все подпакеты, компоненты, методы, возвращаемые значения, используя выражение.

1 голос
/ 19 октября 2011

Вы рассматривали АОП?(Аспектно-ориентированное программирование) - если под «я не могу изменить java. * Классы» вы имеете в виду, что у вас нет доступа к не скомпилированному коду, и вы не можете добавить конфигурацию и т. Д., Тогда это, вероятно, не сработает для вас.В любом другом случае проверьте эту ссылку для примеров использования Spring-aop:

http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

Если нет, вы можете рассмотреть решения, основанные на удаленной отладке или профилировании.Но все они включают «некоторый» доступ к исходному коду, хотя бы только для включения / отключения доступа JMX.

...