isbridge --- 자바 반사 중 브리지 방법

4429 단어 mybatis자바반사
my btis 에 나타 난 Reflector 클래스 에서 ger / set 방법 을 분류 하여 얻 을 때 다음 과 같은 코드 정보 가 있 습 니 다. isBridge 에 대한 궁금 증 은 기록 에 따 릅 니 다.
그 주요 역할 을 분석 하면 다음 과 같다.
     
/***
   Reflector.addUniqueMethods()                 ,    
uniqueMethods    
***/ 
private void addUniqueMethods(Map uniqueMethods, Method[] methods) {
    for (Method currentMethod : methods) {
      if (!currentMethod.isBridge()) {
/***   Reflector.getSignature ()           :     #    : 
         。   ,Reflector.getSignature(Method )        :
    II java . lang.String#getSignature : ] ava.lang.reflect .Method
       Reflector. getSignature( )               ,            
***/
        String signature = getSignature(currentMethod);
     //                 ,           ,9)1]          ,
    //      uniqueMethods          
        if (!uniqueMethods.containsKey(signature)) {
          if (canAccessPrivateMethods()) {
            try {
              currentMethod.setAccessible(true);
            } catch (Exception e) {
              // Ignored. This is only a final precaution, nothing we can do.
            }
          }
           //              
          uniqueMethods.put(signature, currentMethod);
        }
      }
    }
  }

구체 적 인 코드 정 보 는 my batis 소스 코드: Reflector 류 를 참조 하 십시오. 
Reflector 클래스 에서 클래스 를 가 져 오 는 get / set 방법 은 보통 세 가지 주요 절 차 를 거 칩 니 다.
1) 우선, Reflector. getClassMethods () 방법 으로 현재 클래스 와 부모 클래스 에서 정의 하 는 모든 방법의 유일한 서명 과 해당 하 는 Method 대상 을 가 져 옵 니 다.가 져 올 때 Reflector. addUniqueMethods () 방법 을 사용 하여 모든 방법 에 유일한 서명 을 만 들 고 우물 은 유 니 크 Methods 집합 에 기록 합 니 다.
(2) 그리고 JavaBean 의 규범 에 따라 Reflector. getClassMethods () 방법 으로 되 돌아 오 는 Method 배열 에서 이러한 종류의 지 가 르 방법 (구체 적 으로 어떤 방법 이 지 우 어 방법 이 라 고 할 수 있 는 지, 나중에 자세히 소개 할 것) 을 찾 아 conflictingGetters 집합 에 기록 합 니 다. conflictingGetters 집합 (Has 찬! fap > () 유형)의 key 는 속성 이름 이 고 value 는 이 속성 에 대응 하 는 getter 방법 집합 입 니 다.
(3. Reflector. resolveGetterConflicts () 방법 을 호출 하여 이러한 복사 상황 을 처리 하 는 동시에 처 리 된 getter 방법 을 getMethods 집합 에 기록 하고 반환 값 형식 을 getTypes 집합 에 채 웁 니 다.
Method. isBridge 원본 주소:https://www.cnblogs.com/zsg88/p/7588929.html
브 릿 지 방법 은 JDK 1.5 가 범 형 을 도입 한 후 자바 의 범 형 방법 으로 생 성 된 바이트 코드 와 1.5 버 전의 바이트 코드 를 호 환 하기 위해 이 루어 졌 다. 컴 파일 단계 에서 자동 으로 생 성 되 는 지 를 판단 하 는 데 구체 적 인 역할 을 한다.
 가정 인터페이스 
public interface SuperClass {
    void method(T t);
}

그것 의 실현 류
 
public class AClass implements SuperClass {
    @Override
    public void method(String s) {
    System.out.println(s);
  } 
}

 
범 형 은 1.5 에서 도입 되 었 기 때문에 앞으로 호 환 되 기 위해 컴 파일 할 때 범 형 (범 형 지우 기) 을 제거 합 니 다. 그러면 SuperClass 인터페이스 에 있 는 method 방법의 매개 변 수 는 가상 컴퓨터 에서 Object 일 수 밖 에 없습니다.
그것 은 아마 이 모양 일 것 이다.
public interface SuperClass {
    void method(Object  t);
}

 AClass 는 SuperClass 인 터 페 이 스 를 실 현 했 지만 그 실현 방법 은 다음 과 같다.
   public void method(String s) {
    System.out.println(s);
  } 

전혀 실현 되 지 않 았 다. void method (Object t) 방법. 이것 은 어떻게 된 일 입 니까? 사실 가상 컴퓨터 는 자동 으로 하나의 방법 을 실현 하 였 습 니 다.
AClass 는 가상 컴퓨터 에서 이 모양 입 니 다.
 
public class AClass implements SuperClass  {
    public void method(String s) {
        System.out.println(s);
    }
    public void method(Object s) {
         this.method((String) s);
    }
}

 
 
이 void method (Object s) 바로 브리지 방법 입 니 다.
우 리 는 이 명령 으로 살 펴 보 았 다.
javap -p AClass.class

다음 과 같이 보이 기:
 
Compiled from "AClass.java"
public class AClass implements SuperClass {
  public AClass();
  public void method(java.lang.String);
  public void method(java.lang.Object);
}

 
 우 리 는 반사 로 테스트 를 써 서 결과 가 어떤 지 보 자.

    public static void main(String[] args) throws Exception {
        AClass obj = new AClass();
        Method m = AClass.class.getMethod("method", String.class);
        m.invoke(obj, "XXXXXXXXXXXXXXXXXX");
        System.out.println(m.isBridge());
        m = AClass.class.getMethod("method", Object.class);
        m.invoke(obj, "##################");
        System.out.println(m.isBridge());
    }

 
테스트 결 과 는 다음 과 같다.
XXXXXXXXXXXXXXXXXX
false
##################
true

 

좋은 웹페이지 즐겨찾기