Java 动态署理ITeye - 众发娱乐

Java 动态署理ITeye

2019年02月23日11时08分15秒 | 作者: 振平 | 标签: 动态,办法,调用 | 浏览: 1190

   动态署理一般运用java.lang.reflect.Proxy类的

   static Object newProxyInstance(ClassLoader loader, Class ? [] interfaces, InvocationHandler h) 

   办法创立一个署理类实例.

   

   传递的参数中:

     Class ? [] interfaces 表明能够把创立的署理类强制转化成相应的接口,然后调用接口办法.

     

     InvocationHandler 是一个接口.

     接口办法为invoke(Object proxy, Method method, Object[] args),

     

     Proxy.newProxyInstance办法创立接口类,需求一个这个接口的完成类.

     完成这个InvocationHandler接口的类时,需求在结构函数中,把被署理的 方针实例(target) 传递曩昔,

     然后在invoke办法中,调用Method method的method.invoke(target, args);办法(实在调用被署理实例的办法).

 

   总结:

   运用 Proxy.newProxyInstance 办法动态创立署理类实例.

      参数ClassLoader loader 类加载器,运用被署理类 实例的类加载器即可.

      

      参数 Class ? [] interfaces  决议 动态生成的署理实例可调用的办法(经过强制转化创立的署理类实例为该接口类型即可)

      

      署理类实例对Class ? [] interfaces中任何办法的调用,

      都转化成对InvocationHandler h参数(InvocationHandler接口的完成类)

      的invoke(Object proxy, Method method, Object[] args),办法的调用

      其间Object proxy 表明动态生成的署理类实例(即Proxy.newProxyInstance生成的实例);

      Method method 署理类实例调用的办法实例,

      

      在invoke办法中,调用Method method的method.invoke(target, args);办法,

      表明调用 被署理类实例(target)的 接口办法

      由于署理类实例调用接口办法时,其实是调用InvocationHandler的invoke办法,而在这个办法里边

      在调用Method method的method.invoke(target, args);办法(表明调用 被署理类的 接口办法) 的前后

      能够做一些额定操作,这样就完成了署理.

      

2. 相关代码

/**
 * 被署理类完成的接口
public interface TrainStack
 public void SaleTicket();

 

/**
 * 被署理类
public class TrainStackImpl implements TrainStack
 @Override
 public void SaleTicket()
 System.out.println("抵达火车站售票处;");
 System.out.println("给钱,买票");
 System.out.println("");

 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 * Proxy.newProxyInstance办法需求的参数:
 * InvocationHandler接口完成类,
 * 在这个类的结构函数中,传递被署理类的实例.
 * Proxy.newProxyInstance创立的实例中调用的任何办法
 * 都相当于调用InvocationHandler接口完成类的
 * invoke办法,在invoke办法中调用
 * method.invoke(target, args);表明被署理类实例的接口办法嗲用,
 * 且在method.invoke(target, args)调用前后,能够做一些额定操作
 * 这样就形成了动态署理
public class TrainInvocationHandler implements InvocationHandler
 private Object target;
 public TrainInvocationHandler(Object obj) 
 this.target = obj;
 // 调用火车站买票的详细履行售票动作
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
 Object sales;
 //署理先做一些初始作业
 System.out.println("署理开端...");
 System.out.println("买票人抵达火车票代售点;");
 System.out.println("先交代售票服务费;");
 System.out.println("再交火车票票价钱;");
 System.out.println("火车票代售点派人去火车站;");
 System.out.println("");
 //调用火车站售票的动作SaleTicket()办法
 System.out.println("调用实践事务办法...");
 sales = method.invoke(target, args);
 //票买往后,代售点人买票回来
 System.out.println("持续署理...");
 System.out.println("火车票代售点人将代买来的火车票交给买票人.");
 return sales;
 // 火车票代售点,创立详细署理方针
 // obj 承受详细买票的人
 * 这儿要解说下面长长的代码的意思,以及详细做了哪些作业? 榜首
 * 依据obj.getClass().getClassLoader()这个要署理类的类加载器
 * 和obj.getClass().getInterfaces()要署理类所完成的一切的接口
 * 作为参数调用Proxy.getProxyClass(ClassLoader loader, Class ? ... interfaces)
 * 的办法回来署理类的java.lang.Class方针,也就是得到了java动态生成的署理类$Proxy0的Class方针。
 * 一起,java还让这个动态生成的$Proxy0类完成了要署理类的完成的一切接口,并承继了Proxy接口。 第二
 * 实例化这个动态生成的$Proxy0类的一个实例,实例化署理类的结构函数为Proxy(InvocationHandler h),
 * 也就是说要实例化这个动态生成的$Proxy0类,有必要给它一个InvocationHandler参数,也就是咱们自己完成的用来在署理类
 * 办法履行前后做额定作业的类TrainInvocationHandler。
 * 这段代码Proxy.newProxyInstance(obj.getClass().getClassLoader(),
 * obj.getClass().getInterfaces(), new TrainInvocationHandler(obj))
 * 得到的其实是一个类名叫$Proxy0 extends Proxy implements TrainStackImpl的类。
 public static Object getInstance(Object obj)
 return Proxy.newProxyInstance(
 obj.getClass().getClassLoader(),
 obj.getClass().getInterfaces(),
 new TrainInvocationHandler(obj));
 * 咱们假如仍是不理解,能够看一下这段代码
 * 创立某一接口 Foo 的署理: InvocationHandler handler = new MyInvocationHandler(...);
 * Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new
 * Class[] { Foo.class });
 * Foo f = (Foo) proxyClass.getConstructor( new Class[] {
 * InvocationHandler.class }).newInstance(new Object[] { handler });
 * 或运用以下更简略的办法: Foo f = (Foo)
 * Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] {
 * Foo.class }, handler);

 

/**
 * 动态署理客户端调用测验
public class TestDynamicProxy
 public static void main(String[] args)
 TrainStack wantToBuy = new TrainStackImpl(); // 界说一个卖票的人
 TrainStack buyTicket = (TrainStack) TrainInvocationHandler.getInstance(wantToBuy); // 类型要转化
 buyTicket.SaleTicket(); // 调用卖票的办法,其实就是在调用invoke()这个办法

  

附,概念解说:

  什么叫署理呢,网络中有各式各样的署理,比方咱们上网有时候用署理服务器。

    你经过这样上网就是运用了署理上网。

     再举个浅显的比如,你想找某局长帮你做一件工作,但局长官位显赫,你又不能容易见着,你就想到了找他的秘书,经过她传话给局长,这样你就等于请他的秘书帮你办成了那件事。秘书为什么就能够找到局长呢,由于秘书和局长之间有必定的联系。这儿产生了四个方针:你、秘书、局长、秘书-局长(联系)。 

 

      JAVA中相同有署理联系,咱们叫做署理形式。

署理形式的效果是:为其他方针(局长)供给一种署理(秘书)以操控对这个方针(局长)的拜访。署理方针能够在客户端(你)和方针方针(局长)之间起到中介的效果。

署理形式一般涉及到的人物有: 

1.笼统人物(秘书-局长):声明实在方针和署理方针的一起接口(秘书-局长)

2. 署理人物(秘书):署理方针人物(秘书)内部含有对实在方针(局长)的引证,然后能够操作实在方针(局长),一起署理方针(秘书)供给与实在方针(局长)相同的接口(秘书-局长)以便在任何时刻都能替代实在方针(局长)。一起,署理方针(秘书)能够在履行实在方针(局长)操作时,附加其他的操作,相当于对实在方针(局长)进行封装

3. 实在人物(局长):署理人物(秘书)所代表的实在方针(局长),是咱们终究要引证的方针(局长)

附件为工程文件:

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    Java 动态署理ITeye

    动态,办法,调用
  • 2

    ClassLoader学习笔记ITeye

    运用,模块,供给
  • 3

    java compareTo ComparatorITeye

    字符串,长度,办法
  • 4
  • 5
  • 6
  • 7
  • 8

    Stack的使用方法ITeye

    办法,调用,方式
  • 9

    Java操作HessianITeye

    效劳,运用,客户端
  • 10

    排序算法众发娱乐

    排序,交流,冒泡排序