문제

호기심이 있습니다(안정적)오픈 소스 프로젝트를 위한 런타임 java 코드 생성 아닌 다른 cglib?고 사용해야 하는 이유는 무엇입니까요?

도움이 되었습니까?

해결책

ASM

CGLIB 및 거의 모든 다른 라이브러리의 상단에 내장되어 ASM 는 자체 행동에 매우 낮은 수준에 있습니다.이것은 쇼 마개에 대한 대부분의 사람들이 당신을 이해해야의 바이트 코드 및 약간의 JVM 을 제대로 사용.그러나 마스터 ASM 가장 확실히 매우 흥미 롭습니다.그러나 그가 동 ASM4 가이드, 에서 몇 가지의 API 과 설명서를 수 있는 매우 간결하는 경우 그것은 존재하지만,그것은 개선되고 있습니다.그것은 밀접하게 다음과 같이 JVM 버전을 지원하는 새로운 기능을 제공합니다.

그러나,필요할 경우 전체 제어,ASM 은 무기고의 선택입니다.

이 프로젝트를 보는 정기적으로 업데이트;시에 이를 편집 버전 5.0.4 에 출시되었을 수 있습 15 2015.

바이트 버

바이트 버려 새로운 라이브러리 제공하지만 어떤 기능을 하는 CGLIB 또는 Javassist 제공하고 훨씬 더 있습니다.바이트 친구가 될 수 있습니다 완전히 아래로 주문을 받아서 만들어 바이트 코드는 수준과 함께 표현하는 특정 도메인을 허용하는 언어를 아주 읽을 수 있는 코드입니다.

  • 그것을 모두 지원합 JVM 바이트코드 버전을 포함하여,Java8 의미의 변경 내용 일부의 컴파일러에 대한 기본 방법이 있습니다.
  • ByteBuddy 하지 않는 것에서 고통받는 단점이 다른 라이브러리
  • 고도로 구성
  • 매우 빠르(벤치 마크 코드)
  • 형 안전 fluent API
  • 형 안전한 콜백

    Javassist 조언이나 사용자 지정 instrumentation 코드에 기반 코드에서는 일반 String 따라서 유형을 확인하고 디버깅하는 것은 불가능에 이 코드,동 ByteBuddy 를 쓸 수 있습니다 그들의 순수 Java 따라서 적용 유형을 확인하고 디버깅할 수 있습니다.

  • 주석을 기반(유연)

    사용자는 콜백으로 구성할 수 있는 주석을 할 수 있도록을 받고 싶어 매개변수에 콜백입니다.

  • 사용 가능 에이전트로

    멋진 에이전트 빌더 수 있습 ByteBuddy 로 사용할 수 있는 순수한 에이전트로 연결 agent.그것은 다른 종류

  • 매우 잘 설명
  • 의 많은 예제
  • 깨끗한 코드,~94%테스트 범위
  • 안드로이드 덱스 지원

주요 단점은 아마도 더 이 API 는 조금 자세한 초심자를 위해 그러나 그것으로 설계 선택 API 모양을 프록시로 세대 DSL;마술 또는 의 기본값으로 초기화합니다.조작할 때 바이트 코드는 아마도 가장 안전하고 가장 합리적인 선택입니다.또한 여러 예고 큰 자 이지 않는 현실적인 문제입니다.

월 2015 을 받은 이 프로젝트 Oracle Duke's choice award 를 수상.이 시간 그것은 단지 도달 1.0.0 이정표, 아주었습니다.

Note 대체 CGLIB 바이트 버 버전에서 2.1.0.

Javassist

Javadoc 의 Javassist 는 방법보다 더 나은 CGLIB.클래스 엔지니어링 API 입니다,하지만 Javassist 지 않은 완벽한다.특히, ProxyFactory 에 해당의 CGLIB 의 Enhancer 고통에서 어떤 단점이 너무,그냥 몇 가지 목록:

  • 다리 방법을 완전하게 지원되지 않으므로(즉,하나를 위해 생성되는 공변환 유형)
  • ClassloaderProvider 정체되는 대신에,다음에 적용되는 모든 경우에서 같은 클래스 로더
  • 사용자 이름 수영(으로 확인 서명된 항아리)
  • 이 없 확장점 및 거의 모든 방법의 관심 있는 개인은 복잡하는 경우에는 일부를 변경하고자하는 행위
  • 동 Javassist 지원을 제공해 주석의 특성을 클래스에서,그들은 지원되지 않에 ProxyFactory.

에 측면을 지향적 측면,하나의 코드를 삽입 할 수 있습에 프록시가지만,이 방법에 Javassist 이 제한되는 비트 오류가 발생하기 쉬운:

  • 면 코드를 작성에는 일반 Java 는 문자열 컴파일 에서 컴파일
  • no 유형 확인
  • 아 generics
  • 더는 람다
  • 아동(un)복싱

또한 Javassist 인식 보다 느린 Cglib.이것은 주로 때문에 그것의 방법을 읽는 클래스 파일을 읽는 대신 로드 클래와 같은 CGLIB 않습니다.고 구현 자체는 하드를 읽을 수 있는 공정;는 경우 하나의 필요에서 변경 Javassist 코드는 많은 기회를 끊는 무언가이다.

Javassist 고통을 비활동에서뿐만 아니라,자신의로 이동 github2013 년경 는 것을 입증하는 유용한으로 정기적인 커밋구에서는 커뮤니티입니다.

이러한 제약은 여전히 서있 버전에서 3.17.1.전 부딪 버전 3.20.0,아직 그것은 보인다 Javassist 수 있습니다 여전히 문제가 있으로 Java8 을 지원합니다.

JiteScript

JiteScript 않는 것 같은 새로운 조각의 잘 형성 DSL 에 대한 ASM,이를 기반으로 최신 ASM 릴리스(4.0).코드 보기 깨끗합니다.

프로젝트가 여전히 여기에서 그의 나이는 너무 API/행동을 변경할 수 있습니다,플러스 문서는 겁니다업데이트 부족한 경우 포기하지 않습니다.

Proxetta

이것은 오히려 새로운 도구이지만 그것을 제공해 최선 API 를 사용합니다.그것은 수의 다른 유형을 위한 프록시와 같은 서브 클래스는 프록시(cglib 접근)또는 직물 또는 위임입니다.

지만,이것이 오히려 희귀,정보가 없으면 잘 작동한다.이렇게 많은 경우 코너를 거래할 때 다루는 바이트 코드.

AspectJ

AspectJ 은 매우 강력한 도구 측면을 지향 프로그래밍 (만).AspectJ 조작하는 바이트 코드는 목표를 달성하기 위해 같은 있을 수도 있습니다 당신의 목표를 달성할 수 있습니다.그러나,이에 필요한 조작에서 컴파일 타임;봄 제공합 직물로드 시간에 에이전트를 통해 이후 버전 2.5, 4.1.x.

CGLIB

대 CGLIB 입 업데이트되었습니다 이는 질문되었는가 물었다.

CGLIB 은 확실히 빨리,그것은 하나의 주요한 이유 그것은 여전히,주위는 사실과 함께 CGLIB 거의 일보다 더 나은 어떤 대안 지금까지(2014-2015).

일반적으로 라이브러리할 수 있는 다시 쓰기의 클래스에서 실행 시간이 있을 로드하는 것을 피하는 어떤 유형을 하기 전에 해당 클래스가 다시 작성됩니다.따라서,그들은 그를 사용할 수 없습니다 Java 반영하는 API 를 필요로하는 어떤 종류에서 사용되는 반사이 로드됩니다.대신,그들은 그들을 읽을 수 있는 클래스를 통해 파일을 IO(는 성능을 차단기).이것은 예를 들어 Javassist 또는 Proxetta 크게 보다 느린 Cglib 는 단순히 읽습 방법을 통해 반영 API 를 재정의합니다.

그러나,CGLIB 은 더 이상에서 활발한 개발.가 있었 최근 버전만 그 변화를 볼 수 있었으로 중요하지로 많은 대부분의 사람들이 결코 버전으로 업데이트하는 3 이후 CGLIB 일부 소개 심각한 버그 에서 마지막 릴리스를하지 않았다 무엇이 정말로 신뢰를 구축. 3.1 고정의 비애의 버전 3.0(이후 버전 4.0.3Spring framework 재포장 3.1 버전).

또한,CGLIB 소스 코드는 오히려 품질 그런 우리가 보지 못하는 새로운 개발자에 합류 CGLIB 프로젝트입니다.한 느낌의 CGLIB 의 화려 함을 참조하십시오 우편 목록.

참고 다음 제안서 쥬스와 우편 목록,CGLIB 에서 이용 가능 github 을 사용하는 지역 사회를 더 나은 프로젝트,그것은 작동하는 표시(여러 commits 구,ci,업데이트 maven),그러나 대부분의 문제는 아직도 남아 있습니다.

가이 시간에는 작업에 버전 3.2.0,그리고 그들은 초점을 맞추고 노력에 Java8 지만,지금까지 사용하기 원하는 사용자는 java8 원가 사용자에서 구축 시간입니다.그러나 진도는 매우 느립니다.

고 CGLIB 은 여전히려 퍼진 대한 PermGen 메모리 누수가 일어나지 않습니다.그러나 다른 프로젝트 수 없었을 전투 테스트를 위해 많은 년이다.

컴파일 시 주석 처리

이 하나되지 않은 런타임의 물론이지만,중요한 부분을 생태계의 가장 코드를 생성 사용법이 필요하지 않 런타임의 창조이다.

이를 시작으로 자바 5 와 함께 제공되는 별도의 명령행 도구를 프로세스 주석: apt, 고,자바에서 시작 6 주석 처리를 통합으로 Java 를 컴파일러입니다.

몇 시간에 당신이 필요하다는 명시적으로 통과하는 프로세서,지금 ServiceLoader 방법(추가 이 파일 META-INF/services/javax.annotation.processing.Processor 을 jar)컴파일러를 감지할 수 있습을 자동으로 주석 프로세서입니다.

이 접근 방식에 코드를 생성은 단점이 너무 많이 필요로 하는 작업의 이해와 Java 언어하지 않 바이트 코드.이 API 는 조금 귀찮고,하나는 플러그인에서는 컴파일러가야 하지요 이 코드는 가장 탄성 및 사용자 친화적이고 오류 메시지가 표시됩니다.

가장 큰 장점이 여기에 그것을 피하는 또 다른 종속성 런타임에,당신은 피할 수 있습 permgen 메모리 누수가 일어나지 않습니다.하나는 전체제에서 생성된 코드입니다.

결론

2002 CGLIB 정의된 새로운 표준을 조작하는 바이트코드습니다.많은 도구와 방법론(CI,범위,TDD,etc.) 우리가 현재 사용할 수 없었던 또는 성숙하지 않습니다.CGLIB 관리에 관련 십년간 보다는 더 많은 것;꽤 괜찮은 성과입니다.그것은 빠르고 쉽게 API 를 사용하기 보다는 조작하는 컴파일이 직접 있습니다.

그것은 정의된 새로운 표준에 대한 코드를 생성하지만 그것은 요즘 하지 않습니다 더 이상 때문에 환경과 요구 사항이 변경되었다,그래서가 있는 기준과 목표를 달성할 수 있습니다.

JVM 변화에 변화가 최근 및 향후 자바(7/8/9/10)버전(invokedynamic,기본 방법은,가치 유형,etc.).ASM 업그레이드의 API 를 내부에 정기적으로 따라 이러한 변화는 하지만 CGLIB 및 다른 사람들이 아직 그들을 사용합니다.

동 주석 처리를 점점 견인,그것은 유연한 런타임으로 세대입니다.

로 2015 년 바이트 버는 동안 오히려는 새로운 장면에 —제공 대부분의 강력 판매 포인트에 대한 런타임이다.제 업데이트 속도,그리고 저자는 이에 대한 풍부한 지식 Java 바이트 코드를 분리해야 합니다.

다른 팁

Javassist.

프록시를 만들어야한다면 커먼즈 프록시 - CGLIB와 JAVASSIT를 모두 사용합니다.

나는 RAW를 선호합니다 ASM, 어쨌든 cglib에 의해 사용된다고 생각합니다. 수준이 낮지 만 문서는입니다 훌륭한, 일단 익숙해지면 날아갈 것입니다.

두 번째 질문에 대답하려면 반사 및 동적 프록시가 약간 자갈을 느끼기 시작하고 견고한 솔루션이 필요할 때 코드 생성을 사용해야합니다. 과거에는 Eclipse의 빌드 프로세스에 코드 생성 단계를 추가하여 효과적으로 모든 것을 컴파일 할 수 있습니다.

사용하는 것이 더 의미가 있다고 생각합니다 Javassist cglib 대신. 예를 들어 Javasist는 CGLIB와 달리 서명 된 항아리와 완벽하게 작동합니다. 게다가, 최대 절전 모드 프로젝트와 같은 그랜드 Javassist에게 유리한 CGLIB 사용을 중단하기로 결정했습니다.

CGLIB는 10 년 전에 AOP 및 ORM 시대에서 설계 및 구현되었습니다. 현재 사용해야 할 이유가 없으며 더 이상이 라이브러리를 유지 관리하지 않습니다 (레거시 응용 프로그램의 버그 수정 제외). 실제로 내가 본 모든 CGLIB 사용 사례는 현대 프로그래밍의 반 패턴입니다. JVM 스크립팅 언어를 통해 동일한 기능을 구현하는 것은 사소한 일이어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top