JDK의 동적 프록시는 JDK를 java.lang.reflect.Proxy 클래스에 의해 달성된다. 다음은 특별한 경우에 의해 사용 JDK의 다이내믹 프록시를 보여줍니다. 1 . 프로젝트 만들기 웹 웹 프로젝트에 springDemo03은 MyEclipse에서 웹 프로젝트, 봄의 JAR 종속성 및 지원 패키지의 이름을 만들 수 -INF / lib 디렉토리 및 클래스 경로에 배치했다. 2 . 인터페이스 CustomerDao 만들기를 아래와 같이 편집 패키지 CustomerDao이 인터페이스를 만들 프로젝트 src 디렉토리 이름 com.mengma.dao 패키지로 만들었습니다. 에 대한 패키지 페널티 com.mengma.dao, 공중 인터페이스 CustomerDao { 공공 무효 추가 (); //이 추가 공개 무효 , 업데이트를 () // 수정 공공 무효 , 삭제 () // 삭제 공공 무효 ) (찾기를; //쿼리 } 3 . 구현 클래스 생성 CustomerDAOImpl com.mengma.dao 패키지의 인터페이스 클래스 CustomerDaoImpl CustomerDao의 구현을 만들기 위해, 그리고 다음과 같이 인터페이스의 모든 메소드를 구현합니다. 패키지 com.mengma.dao, 공공 클래스 CustomerDAOImpl 구현 CustomerDao { @Override 공공 무효 추가 () { 에서 System.out.println ( "... 고객 추가" ); } @Override 공공 무효 업데이트 () { 에서 System.out.println ( "... 클라이언트를 수정" ); } @Override 공공 무효 삭제 () { 에서 System.out.println ( "삭제 고객 ..."); } @Override 공공 무효 찾기 () { 에서 System.out.println ( "수정 고객 ..." ); } } 4 클래스 MyAspect 컷 만듭니다. com.mengma.jdk라는 패키지를 작성, src 디렉토리에를 패킷 클래스 MyAspect에서 컷, 아래 그림과 같이 편집을 만들 수 있습니다. 패키지 com.mengma.jdk; 공용 클래스 MyAspect { 공개 공극 myBefore () { 에서 System.out.println ( "실행 전에 방법" ); } 공공 공극 myAfter () { 에서 System.out.println ( "메소드의 실행 후에" ); } } 상기 코드는, 절단면이 향상 목표 클래스 (CustomerDAOImpl)의 경우, 두 개의 강화 방법 각각 myBefore () 메소드 myAfter () 메소드를 정의한다.
5 . 프록시 클래스 생성 MyBeanFactory 아래와 같이 클래스를 java.lang.reflect.Proxy JDK 다이나믹 프록시를 이용하여 구현 com.mengma.jdk 패키지의 클래스 이름을 MyBeanFactory 만들한다. 패키지는 com.mengma.jdk; 수입 java.lang.reflect.InvocationHandler; 가져 오기 java.lang.reflect.Method와; 가져 오기 를 java.lang.reflect.Proxy; 가져 오기 com.mengma.dao.CustomerDao, 가져 오기 com.mengma.dao. CustomerDAOImpl는, 공공 클래스 MyBeanFactory는 { 공공 정적 CustomerDao의 getBean () { //는 특정 클래스 준비 최종 CustomerDao customerDao는 = 새로운 새로운 CustomerDAOImpl을 (); // 클래스 인스턴스 컷을 만들 최종 MyAspect myAspect는 = 새로운 MyAspect을 (); // 使用代理类,进行增强 반환 (CustomerDao) Proxy.newProxyInstance ( MyBeanFactory. 클래스 .getClassLoader (), 새로운 클래스 [] {CustomerDao. 클래스 }, 새 의 InvocationHandler () { 공공 개체 호출 (개체 프록시 방법 방법, 객체 []는 인수) 가 발생 하는 Throwable { )를 myAspect.myBefore (; // 前增强 오브젝트 OBJ = method.invoke (customerDao, 인수); myAspect.myAfter (); // 강화가 돌아 OBJ; } }); } } 상기 코드는, 여기서 시뮬레이션의 getBean ()에있어서의 정적 인 정의는, () 메소드의 getBean 호출하여 인스턴스를 생성 IOC의 스프링 프레임 워크를 생각 처음 14 줄의 코드는 customerDao 인스턴스를 만들 수 있습니다. 첫 번째 클래스의 인스턴스를 생성하기위한 코드 (16 개) 라인에 해당하는 방법 형태 클래스 통화 절단 18 ~ 26 향상된 코드 인스턴스 customerDao 방법 만들어 프록시 클래스를 사용하여 행되고, 제 프록시 'newProxyInstance () 메소드 파라미터는 현재 클래스 로더 타입이고, 두 번째 파라미터는 구현 클래스가 인터페이스의 인스턴스를 생성하고, 세번째 파라미터 강조법에 대한 필요성이있다. 이 방법에서 대상 클래스 전후 수행 각 클래스 실행 부 myBefore () 메소드 myAfter () 메소드.
6 . JDKProxyTest 테스트 클래스를 만들기 로 다음, com.mengma.jdk 패키지에 JDKProxyTest라는 테스트 클래스를 만들 수 있습니다. 패키지 com.mengma.jdk, 가져 오기 org.junit.Test, 가져 오기 com.mengma.dao.CustomerDao, 공공 클래스 JDKProxyTest { @Test 공공 무효 시험 () { // 봄 획득에 해당하는 식물 (에서 지정된 콘텐츠를하지만, 이 콘텐츠 프록시 객체) 때 customerDao customerDao = MyBeanFactory.getBean (); //은 방법 수행 , customerDao.add () customerDao.update (); customerDao.delete (); customerDao.find를 (); } } 위의 코드에서 취득한의 getBean () 메소드를 호출하는 경우 CustomerDao 프록시 객체 클래스, 그 객체의 메소드를 호출한다. 7 . 프로젝트를 실행하고 결과를 볼 수 , 성공적으로 실행 () 메서드 콘솔 출력을 JUnit 테스트 실행 테스트를 사용 후