>  기사  >  Java  >  Java 동적 프록시의 원리와 구현 방법은 무엇입니까

Java 동적 프록시의 원리와 구현 방법은 무엇입니까

王林
王林앞으로
2023-05-20 17:52:06996검색

에이전시란 다음을 의미합니다. 일부 시나리오에서 대상은 유명인의 중개업자, 부동산 중개업자를 찾는 주택 구매자 등 일부 작업을 완료하는 데 도움을 줄 수 있는 대리인을 찾습니다.

에이전트는 주로 개체의 동작에 대해 몇 가지 추가 보조 작업을 수행합니다.

프록시 객체 생성 방법:

Java의 대표적인 프록시 클래스는 Java.lang.reflect.Proxy

Proxy는 객체에 대한 프록시 객체를 생성하고 반환하는 정적 메서드를 제공합니다.

Main 클래스:

public class Test {
    public static void main(String[] args) {
        //1、创建一个类,对象类必须实现接口
        star s=new star("小明");
        //为小明这个明星对象生成一个代理对象(经纪人)
        skill s2=StarAgentProxy.getProxy(s);
        s2.sing();//走代理的
        s2.jump();
        
        //运行结果:
        //代理开始
        //小明开始唱歌
        //代理结束
        //代理开始
        //小明开始跳舞
        //代理结束
    }
}

스타 클래스(객체 클래스):

//明星类
public class star implements skill{
    private String name;
 
    public star(String name) {
        this.name = name;
    }
    //重写方法
    public void jump(){
        System.out.println(name+"开始跳舞");
    }
    public void sing(){
        System.out.println(name+"开始唱歌");
    }
}

동작 인터페이스 클래스:

//行为类
public interface skill {
    void jump();//跳舞
    void sing();//唱歌
}

프록시 클래스:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
//代理类
public class StarAgentProxy {
    //定义一个方法来返回一个明星对象的代理对象
    public static skill getProxy(star obj){
        //为小明这个对象生成一个代理对象
        /*
          public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces, 对象实现的接口列表
                                          InvocationHandler h)
         */
        return (skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代理开始");
                        //真正的让小明去唱歌、跳舞
                        //method==>正在调用的方法对象, args==>代表这个方法的参数
                        Object rs=method.invoke(obj,args);
                        System.out.println("代理结束");
                        return rs;
                    }
                });
    }
}

구현 단계:

1인터페이스가 존재해야 합니다

2.

3. 프록시 사용 클래스에서 제공하는 메소드는 객체의 프록시 객체를 가져옵니다

Java 동적 프록시의 원리와 구현 방법은 무엇입니까

프록시 객체를 통해 메소드를 호출합니다.

1. 먼저 프록시로 이동합니다.

2. 프록시는 메소드에 대한 추가 보조 작업을 수행할 수 있습니다.

3. 실제로 객체를 트리거하는 메소드의 실행을 시작합니다. 프록시는 메서드 호출에 결과를 반환하는 역할을 담당합니다.

코드 최적화를 위한 주요 단계:

1. 인터페이스가 있어야 하며 구현 클래스는 인터페이스를 구현해야 합니다(프록시는 일반적으로 인터페이스를 기반으로 구현됩니다).

2. 비즈니스 객체인 구현 클래스의 객체를 생성한 후 해당 비즈니스 객체에 대한 프록시 객체를 만듭니다.

동적 프록시의 장점:

1. 메소드의 소스 코드 및 코드 재사용 개선

2. 프로그래밍 작업 단순화, 소프트웨어 시스템의 개발 효율성 및 확장성 향상

3. 프록시 객체의 모든 메소드에 대한 프록시로 사용할 수 있습니다. 4. 매우 유연하며 모든 인터페이스 유형의 구현 클래스 객체를 프록시로 지원하고 프록시로 직접 사용할 수도 있습니다. 인터페이스 자체가 프록시 역할을 합니다

모든 인터페이스 유형의 구현 클래스 객체에 대한 프록시 역할을 하는 프레임워크 (제네릭 실행 중)

    public static <T> T get(T obj){
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return null;
                    }
                });
    }

위 내용은 Java 동적 프록시의 원리와 구현 방법은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제