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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.