JavaSE-ダイナミックエージェント

1.1動的プロキシ

  • 動的プロキシの役割は静的プロキシの役割と同じです。動的プロキシのプロキシクラスは動的に生成されます。静的プロキシのプロキシクラスは事前に作成されています。
  • 動的エージェントは2つのカテゴリに分類されます。1つはインターフェイスに基づく動的エージェントであり、もう1つはクラスに基づく動的エージェントです。
    • インターフェイスベースの動的プロキシ---- JDK動的プロキシ。
    • クラスベースの動的プロキシcglib。
    • 最近では、動的エージェントを生成するためにjavasistがより頻繁に使用されています。javasistについてのBaidu。

JDKの動的プロキシは、InvocationHandlerとProxyの2つのクラスを理解する必要があります。

InvocationHandler【呼び出しハンドラ】

Object invoke(Object proxy, 方法 method, Object[] args)//参数
//proxy - 调用该方法的代理实例
//method -所述方法对应于调用代理实例上的接口方法的实例。 方法对象的声明类将是该方法声明的接
口,它可以是代理类继承该方法的代理接口的超级接口。
//args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。 原始
类型的参数包含在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean
。

Pxoxy【プロキシ】

//生成代理类
public Object getProxy(){
    
    
  return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                 rent.getClass().getInterfaces(),this);
}

1.2コード例

賃貸インターフェース(抽象的な役割)

package cn.guardwhy.domain;
// 抽象角色:租房
public interface Rent {
    
    
    public void rent();
}

家主

package cn.guardwhy.domain;
// 真实角色: 房东,要出租房子
public class Landlord implements Rent {
    
    
    @Override
    public void rent() {
    
    
        System.out.println("房屋出租!!!");
    }
}

ProxyInvocationHandlerはプロキシの役割です

package cn.guardwhy.proxy;

import cn.guardwhy.domain.Rent;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 该类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
    
    
    // 1.被代理的接口
    private Rent rent;

    public void setRent(Rent rent) {
    
    
        this.rent = rent;
    }

    // 2.生成得到代理类

    public Object getProxy(){
    
    
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                rent.getClass().getInterfaces(), this);
    }

    // 3.处理代理实例,并且返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    
        seeHouse();
        // 动态代理的本质。就是使用反射机制实现
        Object result = method.invoke(rent, args);
        fare();
        return result;
    }
    // 4.方法
    public void seeHouse(){
    
    
        System.out.println("带房客看房...");
    }
    // 收中介费
    public void fare(){
    
    
        System.out.println("收中介费");
    }
}

クライアント(テナント)

package cn.guardwhy.client;

import cn.guardwhy.domain.Landlord;
import cn.guardwhy.domain.Rent;
import cn.guardwhy.proxy.ProxyInvocationHandler;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        // 1.真实角色
        Landlord landlord = new Landlord();
        // 2.代理角色
        ProxyInvocationHandler pith = new ProxyInvocationHandler();
        // 3.通过调用程序处理角色来处理要调用的接口对象
        pith.setRent(landlord);
        Rent proxy = (Rent) pith.getProxy();
        // 4.调用接口
        proxy.rent();
    }
}

結果

総括する

動的エージェントは通常、特定のタイプのビジネスに対して機能し、動的エージェントは複数のクラスに対して機能することができ、エージェントはインターフェイスです。

1.3ダイナミックエージェンシーを深める

UserService

package cn.guardwhy.domain;
// 抽象角色,增删改查业务
public interface UserService {
    
    
    void add();
    void delete();
    void update();
    void query();
}

UserServiceImpl

package cn.guardwhy.domain;

// 真实对象,完成增删改查的操作
public class UserServiceImpl implements UserService {
    
    
    @Override
    public void add() {
    
    
        System.out.println("增加了一个用户");
    }

    @Override
    public void delete() {
    
    
        System.out.println("删除了一个用户");
    }

    @Override
    public void update() {
    
    
        System.out.println("更新了一个用户");
    }

    @Override
    public void query() {
    
    
        System.out.println("查询一个用户");
    }
}

ジェネリック動的プロキシ実装クラスを作成してください!すべてのプロキシオブジェクトはObjectに設定されます。

package cn.guardwhy.proxy;

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

public class ProxyInvocationHandler2 implements InvocationHandler {
    
    
    // 1.被代理的接口
    private Object target;
    // 2.set注入
    public void setTarget(Object target) {
    
    
        this.target = target;
    }

    // 3.生成得到代理类
    public Object getProxy(){
    
    
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    // 4.处理代理实例,并且返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    
        // 调用方法
        log(method.getName());
        Object result = method.invoke(target, args);
        return result;
    }

    // 定义日志方法
    public void log(String msg){
    
    
        System.out.println("执行了" + msg + "方法" );
    }
}

クライアント(テナント)

package cn.guardwhy.client;

import cn.guardwhy.domain.UserService;
import cn.guardwhy.domain.UserServiceImpl;
import cn.guardwhy.proxy.ProxyInvocationHandler2;

public class Client2 {
    
    
    public static void main(String[] args) {
    
    
        //1.真实角色
        UserServiceImpl userService = new UserServiceImpl();
        //2.代理对象的调用处理程序
        ProxyInvocationHandler2 pith = new ProxyInvocationHandler2();
        //3.设置要代理的对象
        pith.setTarget(userService);
        // 动态生成代理类
        UserService proxy = (UserService) pith.getProxy();
        //4.调用方法
        proxy.add();
    }
}

結果

1.4動的プロキシの利点

一部の静的エージェントにはそれがあり、静的エージェントにはありません!

  • 私たちの本当の役割をより純粋にすることができます。いくつかの公共の事柄にもはや注意を払う必要はありません。
  • 公務は代理人が行い、分業を実現し、
  • 公共事業が拡大すると、より集中化されて便利になります。
  • 動的エージェント、通常は特定のタイプのビジネスをエージェントします。動的エージェントは複数のタイプをエージェントできます。エージェントはインターフェイスです。

おすすめ

転載: blog.csdn.net/hxy1625309592/article/details/115080607