이 기사는 Java Dynamic Agents의 지식 포인트를 구성하며 특정 콘텐츠는 다음과 같습니다.
1. Java Dynamic Proxy (비교 공식 진술)
프록시 모델은 일반적으로 사용되는 Java 디자인 모델입니다. 그 특성은 프록시 클래스와 대의원 클래스가 동일한 인터페이스를 가지고 있다는 것입니다. 프록시 클래스는 주로 전처리 메시지, 메시지 필터링, 대의원 클래스로 메시지 전달 및 이벤트 후 메시지를 처리 할 책임이 있습니다. 프록시 클래스와 대의원 클래스 사이에는 일반적으로 연관성이 있습니다. 프록시 클래스의 객체는 대의원 클래스의 객체와 관련이 있습니다. 프록시 클래스 자체의 객체는 실제로 서비스를 구현하지는 않지만 대의원 클래스 객체의 관련 방법을 호출하여 특정 서비스를 제공합니다.
에이전트 생성 기간에 따르면, 에이전트 클래스는 두 가지 유형으로 나눌 수 있습니다.
정적 프록시 : 프로그래머가 생성하거나 특정 도구별로 소스 코드를 자동으로 생성하고 컴파일합니다. 프로그램이 실행되기 전에 프록시 클래스의 .class 파일이 이미 존재합니다.
동적 프록시 : 프로그램이 실행될 때 반사 메커니즘을 사용하여 동적으로 생성됩니다.
2. 동적 프록시 구현
java.lang.reflect.proxy,
프록시는 동적 프록시 클래스 및 인스턴스를 생성하기위한 정적 메소드를 제공합니다.
NewProxyInstance ()
지정된 통화 핸들러에 메소드 호출을 할당 할 수있는 지정된 인터페이스의 프록시 클래스의 인스턴스를 반환합니다.
2.1. DAO 인터페이스 (시뮬레이션 된 데이터 액세스 계층 인터페이스 제공)
패키지 javaproxy;/** 데이터 액세스 계층 인터페이스 정의*/public interface dao {// 데이터 저장 공개 void save ();} 2.2. daoimpl 클래스 구현 클래스
패키지 javaproxy; 공개 클래스 daoimpl은 dao {@override public void save () {system.out.println ( "저장 메소드 실행 ................")을 구현합니다. }} 2.3. 에이전트 처리 클래스
패키지 javaproxy; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; 공개 클래스 daohandler는 invocationhandler {private object obj; public daohandler (object obj) {this.obj = obj;} @override public object invoke (개체 프록시, 메소드 메소드, 오브젝트 [] args) 던질 수있는 {system.out.println ( "방법"); args); System.out.println ( "방법 후 무언가를하십시오"); // AOP의 포스트 메드는 여기에서 시뮬레이션됩니다. }} 2.4. 클라이언트 전화
패키지 javaproxy; java.lang.reflect.proxy import; public class client {public static void main (String [] args) {// metaobject (proxed object) daoimpl daoimpl = new daoimpl (); // 비즈니스 프록시 클래스 daohandler daohandler = new daohandler (daoimpl); dao dao = (dao) proxy.newproxyinstance (daoimpl .getClass (). getClassLoader (), daoimpl.getClass () .getInterfaces (), daoHandler); dao.save (); }}2. 5. 결과
3. Mybatis의 프록시 구현을 시뮬레이션합니다
3.1. MapperProxy 클래스
패키지 javaproxy; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; import java.lang.reflect.proxy; public class mapperProxy는 invocationHandler {@suppresswarnings ( "unchecked") / * * * @param을 통한 대상을 얻는다 * @param : @param : sqlsession** @return을 사용하여 메소드를 실행합니다. Proxy Object*/ public static <t> t NewMapperProxy (class <T> MapPerInterface, Object SQLSession) {ClassLoader ClassLoader = MapPerInterface.getClassLoader (); class <?> [] interfaces = new Class [] {mapperinterface}; MapperProxy proxy = 새로운 MapperProxy (); return (t) proxy.newproxyinstance (클래스 로더, 인터페이스, 프록시); } / * * * (nonjavadoc) * * @see java.lang.reflect.invocationhandler#invoke (java.lang.object, * java.lang.reflect.method, java.lang.object []) * * @param : proxy 객체 * * @param : 방법을 통한 방법을 찾습니다. 해당 매개 변수 맵 찾기** @return : 실행 된 매개 변수 객체를 반환하십시오*/ public 객체 호출 (개체 프록시, 메소드 메소드, 객체 [] args) 던지기 가능 {// 여기, 해당 작업은 메소드 이름과 매개 변수 시스템을 통해 해당 맵퍼를 구문 분석하여 수행됩니다. 널 리턴; }} 3.2. 고객
패키지 javaproxy; java.lang.reflect.proxy import; public class client {public static void main (String [] args) {dao dao = mapperproxy.newmapperProxy (dao.class, null); dao.save (); }}3.3. 결과
위는 JDK 동적 프록시를 사용하는 예입니다. 모든 사람이 Java 프로그래밍을 배우는 것이 도움이되기를 바랍니다.