2009-02-18 2 views
8

나는 an application server을 만들고 있는데, 일부 바이트 코드 조작 (예 : @Entity으로 주석 된 클래스에 사용자 정의 equals 및메소드 삽입)을 사용해야합니다. 이제 JVM에 ASM을 사용하여 바이트 코드 변환을 수행하는 Java Agent (-javaagent 옵션)를 제공합니다.OSGi를 사용할 때 바이트 코드 조작이 가능합니까?

나는 OSGi을 사용하려고했지만, 필요한 바이트 코드 조작을 할 수 있는지 여부를 모르겠다.

  1. OSGi를 사용할 때 바이트 코드 조작이 가능합니까? 방법?
  2. 번들이 자체 선언을 할 수 있습니까? 바이트 코드 조작이 필요합니다. 예를 들어 애플리케이션 서버는 자체 코어 클래스 중 일부를 조작해야합니다.
  3. 다른 번들이 바이트 코드 조작을 필요로하는지 지정할 수 있습니까? 예를 들어 서버에서 실행되는 모든 응용 프로그램을 조작해야하지만 응용 프로그램은이를 알 필요가 없습니다.
  4. 번들은 스스로 선언 할 수 있으며, 그것에 의존하는 모든 번들은 바이트 코드를 조작해야합니까? 이렇게하면 @Entity 주석이 포함 된 API 번들에 의존하는 모든 사용자를 조작해야한다고 쉽게 선언 할 수 있습니다.

답변

3

1) 예, OSGi에서 바이트 코드 조작을 수행 할 수 있습니다. 표준 Java와는 조금 다른 점이 있습니다. 여기서 설명하는 익스텐더 패턴을 사용해야합니다. http://www.osgi.org/blog/2007/02/osgi-extender-model.html. Eclipse가 춘분 프로젝트에서 사용하고 있다고 생각합니다 : http://www.eclipse.org/equinox/incubator/aspects/. Spring DM은 확실히이 패턴을 사용하여 osgi dm 모듈을 자동 구성합니다.

2) 이는 사용하는 익스텐더 패턴까지입니다. 스프링 익스텐더 (spring extender)가 플랫폼에서 시작되기 전에 번들의 META-INF/spring 폴더에있는 설정 파일을 찾는 방법이다.

3) 다시 말하지만, 이것은 사용자가 정의한 익스텐더에 달려 있습니다.

4) 번들을 시작하기 전에 해결해야하는 종속성이 있기 때문에 Extender는 번들 종속성을 분석하고 바이트 코드 조작을 시작할 수 있기 때문에 가능하다고 생각합니다.

+0

OSGi의 익스텐더 패턴은 바이트 코드 조작과는 거의 관련이 없습니다. Equinox 측면에서는 흔들리는 훅을 설치하는 춘분 방식의 특정 방법을 사용합니다. 아래에서 언급했듯이, 4.3 이후에는이를 수행하는 표준 방법이 있습니다. – aav

+0

aav, 익스텐더 패턴이 바이트 코드 조작과 관련이 없다는 것을 이해합니다. 바이트 코드 조작 메커니즘을 주입하기위한 osgi 라이프 사이클의 좋은시기입니다. 또한 OSGi 4.3이 실제로 발표되기 전에이 대답을 썼다는 것을 명심하십시오! 실제 API는 OSGi 4.3에서 지원되어야하므로 사용이 명확합니다. 응답 순서가 시간이 지남에 따라 바뀔 수 있기 때문에 "아래"를 참고하는 것이 오해의 소지가 있습니다. –

6

OSGI 4.3에는 사용자가 선택한 바이트 코드 조작자로 바이트 코드 조작을 수행 할 수있는 WeavingHook이 추가되었습니다. 내 프로젝트 중 하나에서 JavaAssist와 함께 사용하면 훌륭하게 작동합니다.

관련 문제