자바 프록시 란 무엇입니까?
Java 프록시란 무엇인가요?
프록시란 무엇인가요? , 실제로 이해하기 쉽습니다. 즉, 대상에 직접 액세스하지 않고 다음과 같이 중간 계층을 통해 액세스합니다.
# 🎜🎜#Java 정적 프록시
예를 들어 바나나, 사과 등과 같은 과일을 Java 코드로 작성하면 다음과 같을 것입니다. (추천 튜토리얼: #🎜 🎜#java tutorial)//Fruit.java/**
* 水果的接口
*/public interface Fruit { /**
* 获取水果的名字
*/
public String getName();
}//Apple.javapublic class Apple implements Fruit { @Override
public String getName() { return "苹果";
}
}//Banana.javapublic class Banana implements Fruit { @Override
public String getName() { return "香蕉";
}
}
//PeelFruitProxy.java/** * 代理,让每个水果去皮 */public class PeelFruitProxy implements Fruit { private Fruit mFruit; public PeelFruit(Fruit fruit) { this.mFruit = fruit; } @Override public String getName() { System.out.println("proxt:" + proxy.getClass().getName()); return "去皮的" + mFruit.getName(); } }
테스트 클래스를 추가했는데, 테스트 클래스는 다음과 같습니다.
//Main.javapublic class Main { public static void main(String[] args) { Apple apple=new Apple();//原始的苹果 Banana banana=new Banana();//原始的香蕉 PeelFruitProxy peelApple=new PeelFruitProxy(apple);//代理,添加去皮功能 PeelFruitProxy peelBanana=new PeelFruitProxy(banana);//代理,添加去皮功能 System.out.println(peelApple.getName()); System.out.println(peelBanana.getName()); } }
위는 Java의 정적 프록시는 간단히 말하면 원래 대상 객체를 하나의 레이어로 래핑하고 새로운 것을 추가한 다음 대상 자체를 호출하는 것을 의미합니다. 그런데 그냥 이런 정적 프록시라면 인터페이스에 프록시가 필요한데, 구현하기가 많이 번거롭나요?
Java의 동적 프록시Java에는 Proxy라는 클래스가 있는데 직접 리플렉션, 프록시 가로채기를 사용할 수 있습니다. 먼저 이 클래스를 간단히 소개하겠습니다. 실제로 가장 일반적으로 사용되는 정적 메서드는 Proxt.newProxyInstance()입니다. 이는 다음과 같습니다.
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
먼저 InvocationHandler를 구현하고 호출 메서드를 구현해야 합니다. 대상 개체를 호출하면 호출 메서드가 먼저 호출되고 구현자는 이 메서드에서 피호출자 메서드를 적극적으로 호출해야 합니다.
//FruitInvocationHandler.java/** * 调用方法拦截器 */public class FruitInvocationHandler implements InvocationHandler { private Fruit mFruit; public FruitInvocationHandler(Fruit fruit) { this.mFruit = fruit; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String result = (String) method.invoke(mFruit, args);//需要在这个方法里面,主动调用被代理的对象。 return "去皮的" + result; } }
실행:
//Main.Javapublic class Main { public static void main(String[] args) { Apple apple = new Apple(); Fruit proxyApple = (Fruit) Proxy.newProxyInstance(Fruit.class.getClassLoader(), new Class[]{Fruit.class}, new FruitInvocationHandler(apple)); System.out.println(proxyApple.getClass().getName()); System.out.println(proxyApple.getName()); Banana banana = new Banana(); Fruit proxyBanana = (Fruit) Proxy.newProxyInstance(Fruit.class.getClassLoader(), new Class[]{Fruit.class}, new FruitInvocationHandler(banana)); System.out.println(proxyApple.getClass().getName()); System.out.println(proxyBanana.getName()); } }
이 방법은 위에서 언급한 대로 PeelFruitProxy를 생성하는 것입니다(물론 우리가 본 것은 그의 이름은 com.sun.proxy.$Proxy0)이며 매번 작성할 필요가 없도록 동적으로 생성됩니다. 이는 런타임에 모든 클래스를 프록시할 수 있기 때문에 동적 프록시라고 불리는 이유이기도 합니다. 많은 프로그램에서 AOP가 이런 방식으로 구현되지만 몇 가지 특징을 발견했습니다. newProxyInstance()의 두 번째 매개변수는 인터페이스 목록입니다.
동적으로 생성된 프록시 클래스도 인터페이스를 구현해야 하기 때문에 쉽게 하향 변환되어 메소드를 사용할 수 있습니다. 그렇지 않으면 생성된 클래스의 클래스 이름이 com.sun.proxy입니다. $Proxy0 이 방법으로 메모리에 있으면 생성된 메서드를 호출할 수 없습니다. ** 따라서 이 동적 프록시 메서드에는 치명적인 단점이 있습니다. 즉, 프록시된 클래스가 인터페이스를 구현해야 한다는 것입니다. **
CGLib 프록시cglib is a powerful, high performance and quality Code Generation Library, It is used to extend JAVA classes and implements interfaces at runtime.
사용 방법을 간단히 소개하겠습니다. 우선 이 CGLib은 타사 라이브러리이므로 이에 의존해야 합니다.
compile 'cglib:cglib :3.2.8'#🎜 🎜#
최신 버전은 여기(새 버전)에서 볼 수 있습니다. [https://github.com/cglib/cglib/releases] 그럼 한번 시도해 보세요. 위의 프록시를 구현합니다.# 🎜🎜#
//FruitMethodInterceptor.java/** * CGLib代理的方法拦截器 */public class FruitMethodInterceptor implements MethodInterceptor{ @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { String result = (String) proxy.invokeSuper(obj, args);//主要,这里调用的是父类,也就是说, 生成的类和原始类是继承关系 return "去皮的"+result; } }//Main.javapublic class Main { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Apple.class); enhancer.setCallback(new FruitMethodInterceptor()); Apple apple = (Apple) enhancer.create(); System.out.println(apple.getClass().getName()); System.out.println(apple.getName()); } }
실행 효과는 다음과 같습니다. 동일한 기능이 구현된 것을 볼 수 있지만, Apple은 더 이상 원래 Apple 클래스가 아니며 com.zjiecode.learn.java.proxy.Apple$$EnhancerByCGLIB$$44ade224가 되었습니다. 예, 실제로는 원래 Apple이 아닌 이 클래스를 사용하고 있습니다. Apple 클래스에 대한 프록시를 구현했습니다. 이런 방식으로 상속이 사용되므로 프록시된 클래스가 인터페이스를 구현할 필요가 없습니다. 물론 인터페이스를 통해 에이전트를 구현할 수도 있습니다.
첫 번째 유형의 프록시는 여기서 언급되지 않으며 단일 인터페이스 프록시에만 적합하며 컴파일 타임에 결정됩니다. . 두 번째와 세 번째 유형의 프록시는 모두 동적 프록시이지만 차이점이 있습니다.
1) JDK의 동적 프록시는 인터페이스 프록시만 구현할 수 있으며, 패키지된 프록시 객체(클래스의 인스턴스) 즉, 프록시 프로세스 중에 프록시 객체와 대상 객체라는 두 개의 객체가 프록시 객체에 패키지됩니다.
2) CGLib의 프록시는 대상 개체를 상속하고 새 클래스를 생성한 후 프록시를 구현합니다. 이렇게 하면 메모리에 프록시 개체가 있고 대상 개체가 없습니다. 상속 방식
런타임에 프록시 클래스를 생성하는데, 이는 컴파일 타임에 클래스를 생성하는 javapoet와 다릅니다.
위 내용은 자바 프록시 란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.
