Javassist가 잘못된 필드 액세스 코드를 생성하는 것 같습니다.

플로리안 홀

내 응용 프로그램을 시작하는 동안 추가 기능으로 일부 코드를 보강하려고합니다. 전체 설정 자체가 잘 작동하지만 javassist가 잘못된 코드를 생성 할 수 있다고 생각하는 지점이 있습니다.

특정 클래스의 특정 메서드에서이 작업을 수행하고 있으며 반환 값이 실제로 StringBuilder또는 유형 인지 확인하기 전에 확인했습니다 StringBuffer.

ctMethod.insertAfter("$_.SOME_METHOD(); $_.SOME_FIELD = <...>;");

SOME_METHOD () 및 SOME_FIELD는 모두 AbstractStringBuilder의 수퍼 클래스 인 에서 선언됩니다 . 둘 다 공용으로 정의되며 그 자체는 패키지 전용입니다.StringBuilderStringBufferjava.lang.AbstractStringBuilder

작업 자체는 성공했지만이 코드를 실행하면 " java.lang.IllegalAccessError: tried to access class java.lang.AbstractStringBuilder from class <...>" 오류가 발생 합니다. 인쇄 디버깅을 통해 메서드에 액세스하는 것은 잘 작동하지만 필드에 액세스하면 충돌이 발생한다는 것을 알았습니다.

그래서 생성 된 바이트 코드를 확인했습니다.

...
invokevirtual #41 <java/lang/StringBuilder.SOME_METHOD>
...
getfield #72 <java/lang/AbstractStringBuilder.SOME_FIELD>
...

따라서 메서드에 액세스하려면 StringBuilder자체적으로 확인되지만 필드의 경우 수정 된 코드의 위치에서 액세스 할 수없는 AbstractStringBuilder로 확인됩니다. Btw, 디 컴파일 된 바이트 코드는 괜찮아 보입니다.

또한 정적 코드에서이 필드에 액세스하고 있으므로이 필드의 바이트 코드를 확인했습니다.

...
getfield #37 <java/lang/StringBuilder.SOME_FIELD>
...

이것은 기본 컴파일러로 컴파일 된 코드이며 참조 용으로 AbstractStringBuilder를 사용하지 않습니다.

그래서 내 질문은 : JVM의 가시성과 상속 개념에 관한 것을 감독 했습니까? 아니면 javassist가 이것을 올바르게 해결하지 못합니까? 내 설명이 이해할 수 있기를 바랍니다. 그렇지 않으면 알려 주시면 개선하도록 노력하겠습니다.

라파엘 빈터 홀터

이것은 Javassist의 오류입니다.

필드는 가상이 아닙니다. 다른 클래스의 이름을 지정하면 해당 클래스에서 액세스 할 수 있어야하는 다른 (그림자) 필드에 실제로 액세스 할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

gcc가 내 코드를 잘못 컴파일하는 것 같습니다.

분류에서Dev

gcc가 내 코드를 잘못 컴파일하는 것 같습니다.

분류에서Dev

Console.ReadKey가 잘못된 키를 읽는 것 같습니다.

분류에서Dev

PHP가 HTML 코드를 잘못 출력하고 숨겨진 문자가있는 것 같습니다.

분류에서Dev

필요한 것을 인쇄하기 위해이 코드를 얻을 수 없습니다. 내 기능이 잘못 코딩 된 것 같아요

분류에서Dev

Ballerina에서 테이블 데이터 구조에 액세스하는 데 문제가 있습니다. 오류 잘못된 작업 ... 필수가 아닌 필드에 대한 필드 액세스를 지원하지 않습니다.

분류에서Dev

Xcode가 잘못된 코드를 생성하는 이유는 무엇입니까?

분류에서Dev

NSUserDefaults가 전역 적으로 액세스 가능한 변수를 생성하지 않는 것 같습니다.

분류에서Dev

다중 스레드 파이썬 액세스가 동기화 된 것 같습니다.

분류에서Dev

CoreData가 잘못된 변수를 저장하는 것 같습니다.

분류에서Dev

Java 동기화 메소드 문서가 잘못된 것 같습니다.

분류에서Dev

Ada : 액세스 유형 및 레코드가있는 잘못된 완성

분류에서Dev

개체의 필드에 액세스하는 것과 복사하는 것의 성능 / 코드 가독성

분류에서Dev

Read ()를 호출하기 전에 필드에 액세스하려는 잘못된 시도가 있지만 Read ()가 C #에서 호출됩니다.

분류에서Dev

Read ()를 호출하기 전에 필드에 액세스하려는 잘못된 시도가 있지만 Read ()가 C #에서 호출됩니다.

분류에서Dev

auth0-react 라이브러리를 사용하는 액세스 토큰 형식이 잘못된 것 같습니다.

분류에서Dev

내 코드가 잘못 되었나요? 답을 찾을 수없는 것 같습니다

분류에서Dev

IN-Condition 유형 캐스트가 잘못된 것 같습니다

분류에서Dev

액세스 포인트의 DHCP 서버가 인터넷 액세스를 차단하는 것 같습니다.

분류에서Dev

액세스하는 스레드가 이전에 변수를 할당 한 동일한 스레드에서 생성 된 경우 휘발성이 필요합니까?

분류에서Dev

Spotify API에서 액세스 토큰에 대한 코드를 교환 할 때 왜 계속 400 잘못된 요청 오류가 발생합니까?

분류에서Dev

HTML 도우미가 잘못된 이름 속성을 생성하는 것 같습니다.

분류에서Dev

RestSharp가 DateTime 필드가있는 클래스를 직렬화 / 소멸하지 않는 것 같습니다.

분류에서Dev

셀레늄 웹 드라이버를 사용하여 값을 주장하려고하지만 뭔가 잘못된 것 같습니다.

분류에서Dev

액세스 조회 필드의 ADO, 잘못된 필드가 반환 됨

분류에서Dev

sdk pagemod를 사용하는 firefox 애드온은 모든 dom에 액세스하지 못하는 것 같습니다.

분류에서Dev

잘못된 문자를 입력 할 때 텍스트 필드를 지우는 데 문제가 있습니다.

분류에서Dev

웹 사이트에 새 클래스가 있지만 이전 코드를 실행하는 것 같습니다.

분류에서Dev

자식 프로세스는 생성되기 전부터 코드를 실행하는 것 같습니다. 어떻게 중지합니까?

Related 관련 기사

  1. 1

    gcc가 내 코드를 잘못 컴파일하는 것 같습니다.

  2. 2

    gcc가 내 코드를 잘못 컴파일하는 것 같습니다.

  3. 3

    Console.ReadKey가 잘못된 키를 읽는 것 같습니다.

  4. 4

    PHP가 HTML 코드를 잘못 출력하고 숨겨진 문자가있는 것 같습니다.

  5. 5

    필요한 것을 인쇄하기 위해이 코드를 얻을 수 없습니다. 내 기능이 잘못 코딩 된 것 같아요

  6. 6

    Ballerina에서 테이블 데이터 구조에 액세스하는 데 문제가 있습니다. 오류 잘못된 작업 ... 필수가 아닌 필드에 대한 필드 액세스를 지원하지 않습니다.

  7. 7

    Xcode가 잘못된 코드를 생성하는 이유는 무엇입니까?

  8. 8

    NSUserDefaults가 전역 적으로 액세스 가능한 변수를 생성하지 않는 것 같습니다.

  9. 9

    다중 스레드 파이썬 액세스가 동기화 된 것 같습니다.

  10. 10

    CoreData가 잘못된 변수를 저장하는 것 같습니다.

  11. 11

    Java 동기화 메소드 문서가 잘못된 것 같습니다.

  12. 12

    Ada : 액세스 유형 및 레코드가있는 잘못된 완성

  13. 13

    개체의 필드에 액세스하는 것과 복사하는 것의 성능 / 코드 가독성

  14. 14

    Read ()를 호출하기 전에 필드에 액세스하려는 잘못된 시도가 있지만 Read ()가 C #에서 호출됩니다.

  15. 15

    Read ()를 호출하기 전에 필드에 액세스하려는 잘못된 시도가 있지만 Read ()가 C #에서 호출됩니다.

  16. 16

    auth0-react 라이브러리를 사용하는 액세스 토큰 형식이 잘못된 것 같습니다.

  17. 17

    내 코드가 잘못 되었나요? 답을 찾을 수없는 것 같습니다

  18. 18

    IN-Condition 유형 캐스트가 잘못된 것 같습니다

  19. 19

    액세스 포인트의 DHCP 서버가 인터넷 액세스를 차단하는 것 같습니다.

  20. 20

    액세스하는 스레드가 이전에 변수를 할당 한 동일한 스레드에서 생성 된 경우 휘발성이 필요합니까?

  21. 21

    Spotify API에서 액세스 토큰에 대한 코드를 교환 할 때 왜 계속 400 잘못된 요청 오류가 발생합니까?

  22. 22

    HTML 도우미가 잘못된 이름 속성을 생성하는 것 같습니다.

  23. 23

    RestSharp가 DateTime 필드가있는 클래스를 직렬화 / 소멸하지 않는 것 같습니다.

  24. 24

    셀레늄 웹 드라이버를 사용하여 값을 주장하려고하지만 뭔가 잘못된 것 같습니다.

  25. 25

    액세스 조회 필드의 ADO, 잘못된 필드가 반환 됨

  26. 26

    sdk pagemod를 사용하는 firefox 애드온은 모든 dom에 액세스하지 못하는 것 같습니다.

  27. 27

    잘못된 문자를 입력 할 때 텍스트 필드를 지우는 데 문제가 있습니다.

  28. 28

    웹 사이트에 새 클래스가 있지만 이전 코드를 실행하는 것 같습니다.

  29. 29

    자식 프로세스는 생성되기 전부터 코드를 실행하는 것 같습니다. 어떻게 중지합니까?

뜨겁다태그

보관