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