블 로그 읽 기 디자인 모델 의 동적 대리 와 반사

블 로그 읽 기 디자인 모델 의 동적 대리 와 반사
 
먼저 반 사 를 말씀 드 리 겠 습 니 다.
1. 반사 반사 에 관 한 가장 큰 역할 중 하 나 는 우리 가 컴 파일 할 때 특정한 대상 의 유형 을 알 지 않 고 실행 할 때 완전한 '가방 이름 + 클래스 이름' 을 제공 하여 얻 을 수 있다 는 것 이다.메모: 컴 파일 할 때 가 아니 라 실행 할 때 입 니 다.기능: • 실행 할 때 임의의 대상 이 속 한 종 류 를 판단 할 수 있 습 니 다.운행 할 때 임의의 종류의 대상 을 구성 할 수 있다.실행 할 때 임의의 클래스 가 가지 고 있 는 구성원 변수 와 방법 을 판단 합 니 다.실행 할 때 임의의 대상 을 호출 하 는 방법.말하자면 자바 반사 체 제 를 이용 하여 우 리 는 실행 할 때 이름 을 알 수 있 는 class 를 불 러 올 수 있 고 그 구조 방법 을 알 게 되 며 대상 의 실 체 를 생 성하 여 fields 에 값 을 설정 하고 methods 를 불 러 올 수 있다.응용 장면: 반사 기술 은 각종 유 니 버 설 프레임 워 크 개발 에 자주 사용 된다.프레임 워 크 의 유 니 버 설 성 을 확보 하기 위해 서 는 설정 파일 에 따라 대상 이나 종 류 를 불 러 오고 다른 방법 을 사용 해 야 하기 때문에 이 럴 때 반사 - 실행 시 동적 으로 불 러 올 대상 을 불 러 옵 니 다.단점: 반사 가 일정한 시스템 자원 을 추가 로 소모 하기 때문에 동적 으로 대상 을 만 들 필요 가 없다 면 반사 할 필요 가 없다.또 반사 호출 방법 은 권한 검 사 를 무시 할 수 있 기 때문에 패 키 징 성 을 파괴 해 안전 문 제 를 일 으 킬 수 있다.2. 동적 대 리 는 이 대상 에 대한 접근 을 제어 하기 위해 다른 대상 에 게 대 리 를 제공 합 니 다.어떤 경우 에 한 대상 이 다른 대상 에 게 적합 하지 않 거나 직접 인용 할 수 없 으 며 대리 대상 은 이들 사이 에서 중개 역할 을 할 수 있다 (부동산 중개, 집주인 이 중개 에 게 집 을 판매 하도록 위탁 하고 계약 을 체결 하 는 등 과 유사 할 수 있다).동적 에이전트 란 실현 단계 에서 누 구 를 대리 하 는 지 에 관심 을 가지 지 않 고 운영 단계 에서 어느 대상 을 대리 하 는 지 지정 하 는 것 이다 (불확실 성).자신 이 프 록 시 클래스 를 쓰 는 방식 이 라면 정적 프 록 시 (확정 성) 입 니 다.구성 요소: (동적) 대리 모델 은 주로 세 가지 요소 와 관련된다. 하 나 는 추상 적 인 인터페이스 이 고 다른 하 나 는 피 대리 류 (구체 적 으로 추상 적 인 인 인 터 페 이 스 를 실현 하 는 류) 이다. 셋째, 동적 대리 류: 실제 적 으로 피 대리 류 를 호출 하 는 방법 과 속성 류 이다.
 
동적 대 리 는 세 가지 필요 한 조건 이 있 습 니 다.
1. 두 개의 캐릭터 (대리 대상 과 피 대리 대상) 가 있어 야 한다.
2. 대리 대상 은 피 대리 대상 의 인용 을 가 져 야 한다 (피 대리 대상 의 정보 가 있어 야 한다)
3. 과정 을 중시 하고 해 야 할 일, 대리 대상 에 게 시간 이 없 거나 하기 싫 은 일
 
실현 방식: 동적 대 리 를 실현 하 는 방식 이 매우 많다. 예 를 들 어 JDK 자체 가 제공 하 는 동적 대 리 는 주로 반사 체 제 를 이용 한 것 이다.또한 다른 실현 방식 도 있다. 예 를 들 어 바이트 코드 조작 체 제 를 이용 하여 ASM, CGLIB (ASM 기반), Javassist 등 과 유사 하 다.
 
예 를 들 어 자주 사용 할 수 있 는 JDK 가 제공 하 는 동적 프 록 시 인터페이스 Invocation Handler 를 사용 하여 동적 프 록 시 클래스 를 실현 합 니 다.그 중에서 invoke 방법 은 이 인터페이스 정의 가 반드시 실현 되 어야 하 며 실제 방법 에 대한 호출 을 완성 합 니 다.Invocation Handler 인 터 페 이 스 를 통 해 모든 방법 은 이 Handler 가 처리 합 니 다. 즉, 모든 대리 되 는 방법 은 Invocation Handler 가 실제 처리 임 무 를 맡 습 니 다.그 밖 에 저 희 는 invoke 방법 실현 에 사용자 정의 논리 적 실현 을 추가 하여 대리 류 의 업무 논리 에 침입 하지 않 습 니 다.
 
대리 모델 은 우리 생활 에서 많은 이미지 의 예 가 있다. 예 를 들 어 중매쟁이, 전세 중개인 등 은 모두 전형 적 인 동적 대리 모델 이다. 다음은 우리 가 비교적 익숙 한 중매쟁이 로 예 를 들 어 더욱 생동감 있 는 이미지 로 동태 대 리 를 소개 한다.
먼저 JDK 로 동적 대 리 를 실현 합 니 다. 필요 한 조건: 피 에이전트 대상 은 하나의 인 터 페 이 스 를 실현 해 야 합 니 다.
 
public interface Person {
	void findGF();
}
public class James implements Person{

	@Override
	public void findGF() {
		System.out.println("   ");
		System.out.println("     ");
		System.out.println("    180cm  ,  70kg");
	}
}
public class Meipo implements InvocationHandler {
	
	private Object target; //                     
	//           
	public Object getInstance(Object target) throws Exception{
		this.target = target;
		Class clazz = target.getClass();
		System.out.println("      class :"+clazz);
		return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("    :" + "         ");
		System.out.println("      ...");
		System.out.println("------------");
		//         ,      James   
		method.invoke(this.target, args);
		System.out.println("------------");
		System.out.println("      ,     ");
		return null;
	}
}

 
테스트 클래스:
public class TestJDKProxy {
	public static void main(String[] args) {
	try{
		Person person = (Person) new JDKMeiPo().getInstance(new XiaoJie());
		//    findGF()    invoke()  
		person.findGF();
	}catch (Exception e){
		e.printStackTrace();
	}
	}
}

 
 
다음은 CGLIB 방식 으로 동적 대 리 를 실현 합 니 다. CGLIB 는 JDK 에 비해 피 대리 류 가 반드시 인 터 페 이 스 를 실현 해 야 하 는 것 이 아니 라 CGLIB 를 통 해 피 대리 류 의 하위 클래스 를 생 성하 고 부모 류 의 방법 과 속성 을 계승 하여 대리 효 과 를 얻 습 니 다.
public class James {
	public void findLove(){
		System.out.println("       ");
	}
}

프 록 시 클래스 는 MethodInterceptor 인 터 페 이 스 를 실현 해 야 합 니 다.

public class Meipo implements MethodInterceptor{
	//               ?
	public Object getInstance(Class clazz) throws Exception{
		Enhancer enhancer = new Enhancer();
		//       ?
		//       cglib,            
		enhancer.setSuperclass(clazz);
		//    
		enhancer.setCallback(this);
		//   、     
		//   、   class  
		//   、   JVM ,        
		return enhancer.create();
	}
	//                
	//    API     ,    
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("    :" + "         ");
		System.out.println("      ...");
		System.out.println("------------");
		//  obj     CGLib   new   
		//cglib new       ,         (            )
		//OOP,  new    ,           super()   ,
		//new      ,   new    ,                   
		//             
		//             ,              
		proxy.invokeSuper(obj, args);
		System.out.println("------------");
		System.out.println("      ,     ");
		return null;
	}
}

 
public class TestGglibProxy {
	
	public static void main(String[] args) {
		//JDK                  
		//         ,         
		
		//CGLib                    ,         
		//       ,            (         )
		//         
		try {
			James obj = (James)new Meipo().getInstance(James.class);
			obj.findLove();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 
추가:
  정적 에이전트: 프 록 시 클래스 를 미리 작성 하면 손 으로 작성 할 수도 있 고 도구 로 생 성 할 수도 있 습 니 다.단점 은 모든 업무 류 가 하나의 대리 류 에 대응 해 야 하기 때문에 매우 융통성 이 없다 는 것 이다.   동적 에이전트: 실행 시 자동 으로 에이전트 대상 을 생 성 합 니 다.단점 은 프 록 시 대상 을 만 들 고 프 록 시 를 호출 하 는 데 시간 이 걸 리 는 것 이다.  JDK 동적 에이전트: 자바 반사 체 제 를 바탕 으로 이 루어 집 니 다. 인터페이스의 업무 류 를 실현 해 야 이런 방법 으로 대리 대상 을 생 성 할 수 있 습 니 다.새 버 전도 ASM 메커니즘 과 결합 하기 시작 했다.   cglib 동적 에이전트: ASM 메커니즘 을 바탕 으로 업무 클래스 를 생 성 하 는 하위 클래스 를 에이전트 클래스 로 한다.자바 송신 메커니즘 의 흔 한 응용: 동적 에이전트 (AOP, RPC), 제3자 개발 자 확장 능력 제공 (Servlet 용기, JDBC 연결), 제3자 구성 요소 생 성 대상 (DI)...
 
 

좋은 웹페이지 즐겨찾기