java之代理

 代理  参考core java 但感觉作者这部分写得不好 以后再回来修改

   使用代理可以在运行时创建一个实现了某个接口的类。如果在编译时无法确定要实现哪个接口,才使用代理,这也是代理产生的原因。这个在应用开发中不是一个普遍的情况,对于系统级应用,代理会带来许多好处。

   

1 什么时候使用代理

    加入我们想要构造一个对象,并且这个对象实现了一个或多个接口,但是在编译时还无法确定这个类该有什么特征。这是一个复杂的问题,为了创建一个实际的对象,我们可以简单的使用newInstance方法来使用反射找到一个构造器。但是我们并不能实例化一个接口,我们需要在运行时通过实现该接口定义一个类。

    为了战胜这个困难,许多程序生成代码,把它们放在一个文件中,启动编译程序,并且加载结果类文件。很自然,这是缓慢的,也要求编译程序和我们的程序一起部署。代理机制是一个更好的解决方案。代理类在运行时创建了崭新的类。这样的一个代理类实现了我们所定义的接口。特别的,这个代理类有如下的方法:

     1  实现了接口所要求的所有方法

     2  继承了Objcet的方法

    

   然而,我们不能在运行时为这些方法添加代码.取而代之的是我们需要提供一个调用处理器(invoke handler).调用处理器是实现了Invocation Handler接口的实例对象.该接口只有一个方法:

    

   每当这个代理对象的方法被调用,那么调用处理器的invoke方法也会被调用 我们需要在内部调用method.invoke(实际对象,参数),确定返回值。   每一次调用都共享一个invoke  所在要在内部作逻辑判断

来看一个例子

 

package aa;

interface ISomeService {
String doFirst();
void doSecond();
}


class SomeServiceImpl implements ISomeService{


@Override
public String doFirst() {
System.out.println("do First");
return "result";
}


@Override
public void doSecond() {
System.out.println("do Second");
}


}


package aa;

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

public class MyTest {
    public static void main(String[] args) {
          ISomeService target=new SomeServiceImpl();    

          //使用JDK的Proxy动态代理,要求目标类必须实现接口
          // 因为其底层的执行原理,与静态代理相同
          ISomeService service=(ISomeService) Proxy.newProxyInstance(target.getClass().getClassLoader()//目标类的类加载器
                  , target.getClass().getInterfaces() //目标类所实现的所有接口
                  ,new InvocationHandler() {  //匿名内部类

              //proxy:代理对象
              //method:目标方法
              //args:目标方法的参数列表
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                     //调用目标方法
                        System.out.println("hei");
                        Object result=method.invoke(target, args);
                        if(result!=null)
                        {
                        result=((String)result).toUpperCase();
                        }
                        return result;
                    }
                });

          String result=service.doFirst();
          System.out.println("result="+result);
         service.doSecond();
        }
}

结果:
 
 

2  创建代理对象

  为了创建代理对象,使用Proxy类的newProxyInstance方法,这个方法有三个参数

   1  ClassLoader:作为java安全机制的一部分,不同的类加载器可以用于系统类,从网络下载下来的类,等等。

   2   代理类需要实现的接口(一般为被代理类所实现接口的方法)

   3  调用处理器

有两个问题:我们如何定义这个处理器?我们可以使用代理对象干什么?

代理可以用于许多目的,比如:

1  路由选择远程服务器的方法

2 在运行的程序中与动作相关的用户接口事件联系起来。

3  跟踪方法执行处于调式的目的。

 

 

时间: 2024-08-27 11:36:19

java之代理的相关文章

理解java动态代理

java动态代理是java语言的一项高级特性.在平时的项目开发中,可能很难遇到动态代理的案例.但是动态代理在很多框架中起着不可替代的作用,例如Spring的AOP.今天我们就聊一聊java动态代理的实现原理. jdk对于动态代理的支持主要依赖于两个类:Proxy和InvocationHandler.我们先看一下类图. Subject类是主题类,定义了我要做什么.我们需要代理的类即实现Subject接口的RealSubject. 1.InvocationHandler InvocationHand

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

java的代理和动态代理简单测试

什么叫代理与动态代理? 1.以买火车票多的生活实例说明. 因为天天调bug所以我没有时间去火车票,然后就给火车票代理商打电话订票,然后代理商就去火车站给我买票.就这么理解,需要我做的事情,代理商帮我办了,但是需要出手续费. 废话不说了,直接上java代码吧! java动态代理 //接口   (抽象买票的事情) public interface ICalc {     public int add(int i, int j);}//实现这个接口   (具体到我买票的事情) public class

java动态代理机制

首先了解代理设计模式,其思想是为其他对象提供一种代理以控制对这个对象的访问. java动态代理就是遵循这种思想,spring中的AOP实现原理就是java的动态代理. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的. 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通

java动态代理

要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式. 在我看来所谓的代理模式,和23种设计模式中的"装饰模式"是一个东西.23种设计模式中将它们作为两种模式,网上也有些文章讲这两种模式的异同,从细节来看,确实可以人为地区分这两种模式,但是抽象到一定高度后,我认为这两种模式是完全一样的.因此学会了代理模式,也就同时掌握了装饰模式. 代理模式 代理模

java 动态代理示例,带主要注释

Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interface Subject { String hello(String name); void say();} 接口实现: public class ImpSubject implements Subject { @Override public String hello(String name){ r

java动态代理原理及解析

代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性. java动态代理的类和接口(jdk1.6源码) 1,java.lang.reflect.Proxy:动态代理机制的主类,提供一组静态方法为一组接口动态的生成对

彻底理解JAVA动态代理

注:本文转自 http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html 代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 代理模式的结构如下图所示. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Subject { public void doSomething(); } public class RealSubject i

JAVA动态代理详解

1.什么是代理 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 2.什么是动态代理 在程序运行时,运用反射机制动态创建代理实例对象.JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理. 相关类与接口 java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象. //

黑马程序员——Java高新技术代理

代理 普通代理 很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦.代理就为其他类提供了一种控制其对象的方法.代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法. interface Solution{ public void doSomething(); } //委托类Demo实现了接口 class Dem