> Java > java지도 시간 > 본문

Java의 동적 프록시 및 반사 메커니즘에 대한 자세한 소개(코드 예)

不言
풀어 주다: 2019-01-24 11:03:13
앞으로
5495명이 탐색했습니다.

이 글은 Java의 동적 프록시 및 리플렉션 메커니즘에 대한 자세한 소개(코드 예제)를 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

리플렉션 메커니즘

Java 언어에서 제공하는 기본 기능입니다. 리플렉션을 통해 이 클래스나 객체를 얻는 등의 작업을 수행할 수 있습니다. 클래스 메서드, 속성, 생성자 등

동적 프록시: JDK 동적 프록시와 cglib 동적 프록시(스프링의 동적 프록시)로 구분됩니다.

static Proxy

에이전트와 에이전트 간의 관계는 사전에(컴파일 중에) 결정됩니다. 에이전트 프로그램이 실행되기 전에 이미 존재하는 클래스입니다. 이 경우 정적 프록시라고 합니다.

동적 프록시

프록시 클래스는 다음과 같습니다. 프로그램이 에이전시 방식을 실행할 때 생성됩니다. 즉, 프록시 클래스는 Java 코드에 정의되어 있지 않지만 Java 코드의 "명령"을 기반으로 런타임 중에 동적으로 생성됩니다.

정적 프록시에 비해 동적 프록시의 장점은 다음과 같습니다.

동적 프록시는 통합된 방식으로 프록시 클래스의 기능을 쉽게 처리할 수 있습니다(호출 )는 각 프록시 클래스의 기능을 수정하는 것보다 더 유연하고 확장 가능합니다.

JDK의 동적 프록시(인터페이스에 따라 다름)

Java의 동적 프록시 메커니즘에는 두 가지 중요한 클래스 또는 인터페이스가 있습니다. 하나는 InvocationHandler 인터페이스이고 다른 하나는 Proxy 클래스입니다.

InvocationHandler 인터페이스는 동적 프록시 클래스용으로 구현되며 프록시 객체의 작업 처리를 담당합니다.

프록시 클래스는 동적 프록시 클래스 인스턴스 객체를 생성하는 데 사용됩니다. 이 객체를 가져와야 프록시가 필요한 메소드를 호출할 수 있습니다.

동적 프록시의 프록시 클래스는 정적 프록시 클래스에서 수정됩니다. 동적 프록시 클래스는 InvocationHandler 인터페이스를 구현하고 Invoke 메서드를 재정의합니다. Invoke 메서드는 수신 프록시 클래스 메서드 및 매개 변수를 통해 실행됩니다. .

다음 예:

public interface AppService {
	void createApp(String name);
	void deleteApp(String name);
}
//代理类(比如微商代理)
public class AppServiceImpl implements AppService{

	@Override
	public void createApp(String name) {
		System.out.print("App["+name+"] has been created.");
	}

	@Override
	public void deleteApp(String name) {
		System.out.print("App["+name+"] has been delete.");
	}
}

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class LoggerInterceptor implements InvocationHandler {
    private Object target; //委托类(被代理类)的实例,比如厂家
    public LoggerInterceptor(Object target){  
        this.target = target;  
    }  
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
		System.out.println("Entered "+target.getClass().getName()+"-"+method.getName()+",with arguments{"+args[0]+"}");  
        Object result = method.invoke(target, args);
       //调用目标对象的方法  (调用厂家的方法(createApp)及参数(Kevin Test))
        System.out.println("Before return:"+result);  
        return result;  
	}

}
로그인 후 복사
import java.lang.reflect.Proxy;

public class test {

public static void main(String[] args) {
    AppService target = new AppServiceImpl();//生成目标对象 (代理类的对象)
    //接下来创建代理对象 
    AppService proxy = (AppService) Proxy.newProxyInstance( 
    target.getClass().getClassLoader(), 
    target.getClass().getInterfaces(), new LoggerInterceptor(target)); 
    proxy.createApp("Kevin Test1"); 
    proxy.deleteApp("Kevin Test2"); 
  }

}/**
* 1、jdk的动态代理实现方式是依赖于接口的,首先使用接口来定义好操作规范。
* 2、通过proxy类产生的代理对象调用被代理对象的操作。
* 3、而这个操作又被分发给InvocationHandler接口的invoke方法具体执行
* 
* 在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler接口、另一个则是 Proxy类,这个类和接口是实现我们动态代理所必须用到的。
InvocationHandler接口是给动态代理类实现的,负责处理被代理对象的操作的,而Proxy是用来创建动态代理类实例对象的,因为只有得到了这个对象我们才能调用那些需要代理的方法。
* 
* 此方法的参数含义如下 
proxy:代表动态代理对象 
method:代表正在执行的方法 
args:代表当前执行方法传入的实参 
返回值:表示当前执行方法的返回值
* 
* 如上:
* 使用了Proxy类的newProxyInstance方法生成代理对象,然后用这个对象去调用createApp()和deleteApp()方法,
* 其实系统会将这2个方法分发给invoke()方法区执行。其中proxy对象的类是系统帮我们动态创建了,其实实现了我们的业务接口AppService
* 
*/
로그인 후 복사

cglib 동적 프록시(상속 방법)

#🎜 🎜 #cglib 동적 프록시는 MethodInterceptor를 사용하여 동적 프록시 클래스를 구현합니다.

인터셉터 MethodInterceptor에서 프록시 메소드는 MethodProxy의 InvokSuper 메소드에 의해 호출됩니다.

MethodProxy 클래스는 프록시 메서드와 프록시 메서드의 서명을 생성합니다.

JDK 동적 프록시와 Cglib 동적 프록시의 차이점:

1 JDK 동적 프록시는 프록시 객체와 Cglib의 인터페이스를 구현합니다. is 프록시된 개체를 상속합니다.

2. Cglib은 상속 메커니즘이므로 final로 수정된 메서드를 프록시할 수 없습니다.

3. JDK와 Cglib는 모두 런타임 중에 바이트코드를 생성하는 반면, Cglib는 ASM 프레임워크를 사용하여 클래스 바이트코드를 생성합니다. JDK에.

4. JDK는 리플렉션 구현 메커니즘을 통해 프록시 메서드를 호출하는 반면 cglib는 Fashclass 메커니즘을 통해 직접 메서드를 호출하므로 더 효율적입니다.

Fastcalss 메커니즘:

프록시 클래스 및 프록시 클래스에 대한 클래스를 생성합니다. 이 클래스는 프록시 클래스 또는 프록시 클래스가 됩니다. . 메소드는 인덱스를 할당합니다.

이 인덱스는 입력 매개변수로 사용되며, Fashclass가 호출할 메소드를 직접 찾아 직접 호출할 수 있습니다. 이렇게 하면 리플렉션 호출이 필요하지 않으므로 매우 효율적입니다.

위 내용은 Java의 동적 프록시 및 반사 메커니즘에 대한 자세한 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿