프록시 모드는 프록시 객체를 사용하여 사용자의 요청을 완료하고 사용자의 실제 객체에 대한 액세스를 차단합니다.
프록시 모드에는 보안상의 이유와 같은 많은 용도가 있으며 클라이언트가 실제 객체에 직접 액세스하는 것을 차단해야합니다. 또는 원격 통화에서 프록시 객체는 원격 방법의 기술 세부 사항을 처리하는 데 사용해야합니다. 또는 시스템을 개선하기 위해 실제 물체는 지연된 하중의 목적을 달성하기 위해 캡슐화됩니다.
시스템이 시작되면 프록시 모드를 사용하여 가장 많은 리소스를 소비하는 메소드를 분리하면 시스템 시작 속도 속도를 높이고 사용자의 대기 시간을 줄일 수 있습니다. 사용자가 실제로 쿼리를 수행 할 때 프록시 클래스는 실제 클래스를로드하여 사용자 요청을 완료합니다. 이것은 게으른 하중을 달성하기 위해 프록시 모드를 사용하는 목적입니다.
1. 정적 프록시 구현 :
주제 인터페이스 :
공개 인터페이스 idbquery {문자열 요청 (); } 실제 주제 :
public class dbquery는 idbquery {public dbquery () {try {thread.sleep (10000); } catch (예외 e) {e.printstacktrace (); }} public String request () {return "String request"; }} 프록시 클래스 :
공개 클래스 IDBQueryProxy는 IdbQuery {private dbquery dbquery; public string request () {if (dbquery == null) dbquery = new dbquery (); return dbquery.request (); }} 마지막으로 주요 기능 :
public class proxyText {public static void main (String [] args) {idbquery dbquery = new idbqueryProxy (); System.out.println (dbquery.request ()); }}정적 프록시 프록시 클래스는 실제 클래스를 구현하기위한 공통 인터페이스이며 프록시 클래스는 실제 클래스 객체를 나타내며 프록시 클래스 방법에 시간이 많이 걸리는 작업을 구현하기 위해 시간이 많이 걸리는 작업을합니다.
동적 프록시 :
다이나믹 프록시는 실행될 때 프록시 클래스를 동적으로 생성합니다. 즉, 프록시 클래스의 바이트 코드는 런타임에 생성되고로드됩니다. 정적 에이전트와 비교하여, 동적 제제는 실제 목적을 위해 완전히 동일한 캡슐화 클래스를 캡슐화하기 위해주의를 기울일 필요가 없습니다. 많은 주제 인터페이스가있는 경우 각 인터페이스에 대한 프록시 메소드를 작성하는 것이 성가신 일입니다. 인터페이스가 변경되면 실제 클래스와 프록시 클래스를 모두 변경해야하며 시스템 유지 보수에는 도움이되지 않습니다. 둘째, 일부 동적 에이전트의 생성 방법은 지정된 프록시 클래스 실행 로직 인 런타임에서 실행될 수있어 시스템의 유연성을 크게 향상시킵니다.
주제 인터페이스 :
공개 인터페이스 idbquery {문자열 요청 (); } JDK 프록시 클래스 :
공개 클래스 JDBDBQUERYHANDLER는 invocationHandler {idbquery idbquery = null을 구현합니다. @override public object invoke (오브젝트 프록시, 메소드 메소드, 개체 [] args) 던지기 가능 {if (idbquery == null) {idbquery = new dbquery (); } return idbquery.request (); } public static idbquery createjdbproxy () {idbquery jdkproxy = (idbquery) proxy.newproxyInstance (classloader.getSystemClassLoader (), new Class [] {idbquery.class}, new JDBDBQueryHandler (); System.out.println ( "jdbdbqueryHandler.createjdbproxy ()"); jdkproxy를 반환합니다. }} 주요 기능 :
public class proxyText {public static void main (String [] args) {idbquery idbquery = jdbdbqueryHandler.createjdbProxy (); System.out.println (idbquery.request ()); }}또한 CGLIB 및 Javassist Dynamic Proxy를 사용하여 JDK Dynamic Proxy와 유사하지만 JDK Dynamic 클래스의 생성 프로세스가 가장 빠르므로 DifineClass () 메소드가 기본 구현으로 정의되므로 성능이 다른 것보다 낫습니다. 프록시 클래스의 기능 호출에서 JDK의 동적 프록시는 CGLIB 및 Javassist Dynamic Proxy만큼 좋지 않지만 Javassist Dynamic Proxy는 최악의 성능 품질을 가지며 JDK의 구현보다 훨씬 나쁩니다. 실제 개발 응용 프로그램에서 프록시 클래스의 메소드 호출 빈도는 프록시 클래스의 실제 생성 주파수보다 훨씬 높으므로 동적 프록시의 방법 호출 성능은 성능의 초점이되어야합니다. JDK Dynamic Proxy는 프록시 클래스와 실제 주제가 통합 인터페이스를 구현해야하며 CGLIB 및 Javassist Dynamic Proxy에는 그러한 요구 사항이 없습니다.
Java에서 동적 프록시 구현에는 클래스 로더 사용이 포함됩니다. CGLIB를 예를 들어, 동적 클래스의 로딩 프로세스에 대한 간단한 설명이 설명되어 있습니다. CGLIB를 사용하여 동적 프록시를 생성하면 먼저 인ancer 클래스의 인스턴스를 생성하고 프록시 비즈니스를 처리하기위한 콜백 클래스를 공식화해야합니다. Enhancer.create () 메소드에서 프록시 클래스의 바이트 코드는 DefaultGeneratorStrategy.generate () 메소드를 사용하여 생성되고 바이트 배열에 저장됩니다. 그런 다음 ReflectUtils.defineClass () 메소드를 호출하고 반사를 통해 ClassLoader.DefineClass () 메소드를 호출하여 바이트 코드를 클래스 로더에로드하여 클래스의로드를 완료합니다. 마지막으로, reflectUtils.newinstance () 메소드를 통해 반사에 의해 동적 클래스 인스턴스가 생성되고 인스턴스가 반환됩니다. 다른 것들은 프로세스 세부 사항과 다르지만 생성 로직은 동일합니다.
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.