자바 에이전트 모드(정적 에이전트,동적 에이전트,cglib 에이전트)

에이전트 모드
프 록 시 모드(Proxy Pattern)는 구조 적 모드 이다.프 록 시 모드 는 대상 에 대한 접근 을 제어 하기 위해 대역 을 제공 합 니 다.즉,대리 대상 을 통 해 목표 대상 에 접근 하면 목표 대상 이 실현 되 는 토대 에서 추가 적 인 기능 조작 을 강화 할 수 있다.즉,목표 대상 의 기능 을 확장 하 는 것 이다.
프 록 시 대상 은 원 격 대상,씀 씀 이 응답 대상 을 만 들 거나 안전 통제 대상 이 필요 할 수 있 습 니 다.프 록 시 모드 는 주로 세 가지 형식 이 있 는데 그것 이 바로 정적 프 록 시,동적 프 록 시(JDK 프 록 시,인터페이스 프 록 시 라 고도 함)와 cglib 프 록 시(메모리 동적 생 성 대상 에서 인 터 페 이 스 를 실현 하지 않 아 도 동적 프 록 시 범주 에 속 할 수 있 음)이다.
아 날로 그:
在这里插入图片描述
정적 에이전트
정적 대 리 는 부모 클래스 나 인 터 페 이 스 를 정의 한 다음 에 대리 대상(즉 목표 대상)과 대리 대상 이 함께 같은 인 터 페 이 스 를 실현 하거나 같은 부모 클래스 를 계승 하 는 것 입 니 다.대리 대상 과 목표 대상 이 같은 인 터 페 이 스 를 실현 한 후 같은 방법 으로 목표 대상 을 호출 하 는 방법.
  • 장점:목표 대상 의 기능 을 수정 하지 않 고 대리 대상 을 통 해 목표 기능 을 확장 할 수 있 습 니 다.
  • 단점:대리 대상 은 목표 대상 과 같은 인 터 페 이 스 를 실현 해 야 하기 때문에 많은 대리 류 가 있 습 니 다.인터페이스 가 증가 하면 목표 대상 과 대리 대상 을 유지 해 야 합 니 다.
  • 예 를 들 어 선생님 이 대리 수업 을 하 는 사례:
    在这里插入图片描述
  • ITEacherDao:인터페이스
  • TeacherDao:목표 대상,인터페이스 실현
  • ITEacherDao TeacherDAOProxy:대리 대상 도 ITEacherDao 인 터 페 이 스 를 실현 하고 ITEacherDao 속성 을 취 합 하여 구조 기 를 통 해 설정 값 을 전달 하고 호출 할 때 대리 대상 을 호출 하 는 방법 으로 대상 을 호출 합 니 다.
  • 코드
    인터페이스
    
    public interface ITeacherDao {
    	void teach(); //      
    }
    
    피 대리 대상
    
    public class TeacherDao implements ITeacherDao {
    	@Override
    	public void teach() {
    		System.out.println("    ");
    	}
    }
    
    대리 대상
    
    public class TeacherDaoProxy implements ITeacherDao {
    	private ITeacherDao target; //          
    	public TeacherDaoProxy(ITeacherDao target) {
    		this.target = target;
    	}
    	@Override
    	public void teach() { //    
    		System.out.println("      ");
    		target.teach();
    		System.out.println("      ");
    	}
    }
    
    테스트
    
    public class Client {
    	public static void main(String[] args) {
    		//       
    		TeacherDao teacherDao = new TeacherDao();
    		//      ,                
    		TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
    		//      ,           
    		teacherDaoProxy.teach();
    	}
    }
    /*    :
          
        
          
    */
    
    동적 에이전트
    동적 에이전트 도 JDK 에이전트,인터페이스 에이전트 라 고 합 니 다.프 록 시 대상 이 인 터 페 이 스 를 실현 할 필요 가 없 도록 합 니 다(단,대상 이 인 터 페 이 스 를 실현 하려 면).프 록 시 대상 의 생 성 은 JDK 의 API 를 이용 하여 메모리 에 프 록 시 대상 을 동적 으로 구축 합 니 다.
    즉,JDK 패키지java.lang.reflect.Proxy중의newProxyInstance방법 을 사용 하여 대상(피 에이전트 대상)을 동적 으로 만 듭 니 다.이 방법 은 다음 과 같이 세 개의 인 자 를 받 아야 합 니 다.
    1.ClassLoader loader 는 현재 대상 이 사용 할 클래스 로 더 를 지정 합 니 다.
    2.Class[] 인터페이스 대상 이 실현 하 는 인터페이스 유형 은 일반적인 방법 으로 유형 을 확인 합 니 다.
    3.InvocationHandler h 일 처리,대상 의 방법 을 실행 할 때,현재 실행 중인 대상 방법 을 매개 변수 로 전송 합 니 다.
    
    static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
    
    아 날로 그:
    在这里插入图片描述
    핵심 은getProxyInstacne()
  • 들 어 오 는 대상 에 따라 TeacherDao 목표 대상
  • 반환 메커니즘 을 이용 하여 대리 대상 을 되 돌려 줍 니 다
  • 그리고 대리 대상 을 통 해 목표 대상 을 호출 하 는 방법
  • 코드:
    인터페이스
    
    public interface ITeacherDao {
    	void teach();
    	void tesst(String name);
    }
    
    목표 대상
    
    public class TeacherDao implements ITeacherDao {
    	@Override
    	public void teach() {
    		System.out.println("    ");
    	}
    	@Override
    	public void tesst(String name) {
    		System.out.println("    :" + name);
    	}
    }
    
    대리 대상
    
    public class ProxyFactory {
    	//         , Object
    	private Object target;
    	//    ,  target      
    	public ProxyFactory(Object target) {
    		this.target = target;
    	}
    	//          
    	public Object getProxyInstance() {
    		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
    				target.getClass().getInterfaces(),
    				new InvocationHandler() { //     invoke  
    					@Override
    					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    						System.out.println("      ");
    						Object returnVal = method.invoke(target, args);//             
    						System.out.println("      ");
    						return returnVal;
    					}
    				});
    	}
    }
    
    테스트
    
    public class Client {
    	public static void main(String[] args) {
    		//      
    		ITeacherDao target = new TeacherDao();
    		//      
    		ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();
    		//            
    		System.out.println(proxyInstance.getClass());
    		//      ,         
    		proxyInstance.teach();
    		proxyInstance.tesst("    ");
    	}
    }
    /*    :
          
        
          
          
        :    
          
    */
    
    cglib 에이전트
    Cglib 대 리 는 하위 에이전트 라 고도 부 릅 니 다.목표 대상 이 인 터 페 이 스 를 실현 하지 않 아 도 되 고 메모리 에 하위 대상 을 구축 하여 목표 대상 에 대한 기능 확장 을 실현 합 니 다.어떤 것 은 Cglib 대 리 를 동적 에이전트 에 귀속 시 킵 니 다.
    Cglib 는 고성능 코드 생 성 패키지 로 실행 기간 에 자바 류 를 확장 하고 자바 인 터 페 이 스 를 실현 할 수 있 습 니 다.많은 AOP 프레임 워 크 에 사 용 됩 니 다(예 를 들 어 Spring AOP).cglib 패키지 의 밑바닥 은 바이트 코드 처리 프레임 ASM 을 사용 하여 바이트 코드 를 변환 하고 새로운 클래스 를 생 성 합 니 다.
    특히 주의:프 록 시 클래스 는 final 이 될 수 없습니다.그렇지 않 으 면 오류java.lang.IllegalArgumentException를 보고 할 수 없습니다.대상 의 방법 이 final 이나 static 이면 차단 되 지 않 습 니 다(즉,대상 의 추가 업무 방법 을 실행 하지 않 습 니 다).
    cglib 패키지 추가:아래 jar 패 키 지 를 다운로드 하여 프로젝트 에 복사 한 다음add to library오른쪽 단 추 를 누 르 십시오.
    在这里插入图片描述
    在这里插入图片描述
    다른 것 은 대리 대상 이MethodInterceptor인 터 페 이 스 를 실현 하고intercept()방법 을 재 작성 하여 피 대리 대상(대상)에 대한 방법 을 호출 하 는 것 입 니 다.
    코드:
    목표 대상
    
    public class TeacherDao {
    	public String teach() {
    		System.out.println("    ");
    		return " ";
    	}
    }
    
    대리 대상
    
    public class ProxyFactory implements MethodInterceptor {
    	//    
    	private Object target;
    	public ProxyFactory(Object target) {
    		this.target = target;
    	}
    	//  target       
    	public Object getProxyInstance() {
    		//       
    		Enhancer enhancer = new Enhancer();
    		//    
    		enhancer.setSuperclass(target.getClass());
    		//      
    		enhancer.setCallback(this);
    		//      ,     
    		return enhancer.create();
    	}
    	//  intercept  ,          
    	@Override
    	public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
    		System.out.println("Cglib    ");
    		Object returnVal = method.invoke(target, args);
    		System.out.println("Cglib    ");
    		return returnVal;
    	}
    }
    
    테스트
    
    public class Client {
    	public static void main(String[] args) {
    		//      
    		TeacherDao target = new TeacherDao();
    		//       ,              
    		TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance();
    		//         ,  intecept   ,            
    		proxyInstance.teach();
    		System.out.println(res);
    	}
    }
    /*    :
    Cglib    
        
    Cglib    
     
    */
    
    활용 단어 참조
  • 방화벽 대리
  • 내부 네트워크 는 대리 로 방화벽 을 뚫 고 공공 네트워크 에 대한 방문 을 실현 합 니 다.
  • 캐 시 에이전트
  • 자원 을 요청 할 때 캐 시 에이전트 에서 먼저 가 져 옵 니 다.데이터베이스 나 네트워크 에서 가 져 오지 못 하면 캐 시 를 업데이트 합 니 다(예:Redis).원 격 에이전트
  • 네트워크 를 통 해 원 격 대상 과 정 보 를 소통 합 니 다(예 를 들 어 원 격 연결 서버).
  • 동기 에이전트
  • 다 중 스 레 드 프로 그래 밍 에 사용 하여 다 중 스 레 드 간 동기 화 작업 을 완성 합 니 다.
  • 총결산
    이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기