java动态代理示例分享

首先分析动态代理模式中的3个角色:
1.抽象角色:static proxy中它可以为抽象类,但是dynamic proxy中它只能是接口
2.真实角色:就是实现了抽象角色中的方法罢了
3.代理角色:最恶心的就是动态代理里面的这个代理角色了。它要持有真实角色的引用。

它涉及到一个接口和一个类,InvocationHandler接口和Proxy类。根据JDK文档说,InvocationHandler接口是要被一个类实现的,这个类的实例是一个代理对象对应的handler对象。当代理对象的一个方法被调用,则会把该方法编码并分配给它对应的handler对象的invoke方法中去调用!

代码如下:

//抽象角色:
public interface AbstractRole
{
public void show();
}

//真实角色:

public class RealRole implements AbstractRole

{

@Override

public void show(){ System.out.println("show me your house"); }

}

//代理角色:

//我觉得这只是一个伪代理罢了,伪代理是我自己想出来的= =!,因为它实际是代理对应的handler

public class Handler implements InvocationHandler

{

private Object realRole; // 代理角色中需要有真实角色的引用,定义为Object类型则通用

public Handler(Object realRole)

{ this.realRole = realRole; }

@Override

public Object invoke(Object proxy, Method method, Object[] args)

{

System.out.println("Give me your money");  // 这是代理角色自己添加的额外功能罢了

method.invoke(this.realRole, args); //通过反射调用真实角色的方法

System.out.println("Ok...house is yours");//这是代理角色自己添加的额外功能罢了
}

public Object factory()//通过工厂方法生成真正的代理角色

{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //Proxy中的newProxyInstance方法有两个很重要的特点!第一是动态创建一个代理类,若输出好像是名叫$Proxy0的类;第二是通过动态创建的这个类生成一个实例。
}
}

//客户端:
public class Test

{

public static void main(String[] args)

{
     RealRole realRole = new RealRole();//想要代理哪一个真实角色就new出这个真实角色

Handler handler = new Handler(realRole);//这里产生了代理类对应的handler了,我也想叫他伪代理对象

AbstractRole proxy = (AbstractRole)handler.factory();//通过工厂方法产生代理对象
  }

}

以上也许会想这里代理角色怎么能强转为抽象角色呢?原因在于newProxyInstance方法,这个方法太interesting了~就如上面说的,它会自动产生一个类,然后通过类产生代理对象。其实这个类就实现了抽象角色类了,为什么?因为第二个参数已经指明了它实现哪些接口了。所以可以强转了,强转之后就可以调用抽象角色中的方法了

proxy.show();//好!注意这句了,我在最开始有红体字标出来,“会把该方法编码并分配给它对应的handler对象的invoke方法中去调用!” 就因为这句话,所以proxy.show()就是把show方法传到了handler对象中的invoke方法中去了,当然也跟着show方法的参数了,不过这里show方法没有参数。所以proxy.show()这句话实际就是调用了handler对象中的invoke方法。

(0)

相关推荐

  • java实现动态代理方法浅析

    一些Java项目中在mybatis与spring整合中有MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接口的动态代理类. 有鉴于此,本文浅析了java的动态代理. 本文使用动态代理模拟处理事务的拦截器. 接口: public interface UserService { public void addUser(); public void removeUser(); public void searchUser(); } 实现类: public class

  • 基于接口实现java动态代理示例

    Subject.java 复制代码 代码如下: package _20140416_; import java.util.List; public interface Subject {   public String say(String name,int age);   public List<Person> getAllList(String name);} RealSubject.java 复制代码 代码如下: package _20140416_; import java.util.

  • java动态代理详解

    代理都知道吧,你去买东西就有很多的代理商,他们就是卖原厂的东西.比如,你天天要买肉,猪是农民伯伯养的,但你是从屠夫手上买到肉的,这个屠夫就可以当成是代理.那为什么要代理呢,代理有什么用呢,当然是有事给他做了,对于屠夫这个代理就好理解了,因为你自己不可能去宰猪吧,所以代理就是去买活猪,然后宰掉再卖给你,当然屠夫有可能给肉注点水,关键看他坏不坏,所以屠夫的整个流程就是: 这个流程用代码怎么实现呢:我们应该要用三个类You.Butcher.Farmer分别指你.屠夫.农民伯伯.其中农民伯伯又提供一个买

  • java动态代理和cglib动态代理示例分享

    java动态代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建而成. 一.首先我们进行java动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: 复制代码 代码如下: package testAOP;public interface Saying {public void sayHello(String name);    public void ta

  • java jdk动态代理详解

    jdk动态代理要对一个类进行代理,被代理的类必须实现至少一个接口,并且只有接口中的方法才能被代理. jdk实现动态代理一般分为三步: 1. 编写接口和实现类. 2. 写一个处理器,该处理器实现InvocationHandler接口,该接口只有一个方法,其签名为public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;可在该处理器的实现方法中,在方法调用前和调用后加入自己的代码,从而进行动态拦截

  • java代理模式与动态代理模式详解

    1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费.但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的.这点很重要!

  • java动态代理(jdk与cglib)详细解析

    JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经

  • java使用动态代理来实现AOP(日志记录)的实例代码

    下面是一个AOP实现的简单例子: 首先定义一些业务方法: 复制代码 代码如下: /** * Created with IntelliJ IDEA. * Author: wangjie  email:tiantian.china.2@gmail.com * Date: 13-9-23 * Time: 下午3:49 */public interface BussinessService {    public String login(String username, String password

  • 深入解析java中的静态代理与动态代理

    java编码中经常用到代理,代理分为静态代理和动态代理.其中动态代理可以实现spring中的aop. 一.静态代理:程序运行之前,程序员就要编写proxy,然后进行编译,即在程序运行之前,代理类的字节码文件就已经生成了 被代理类的公共父类 复制代码 代码如下: package staticproxy;public abstract class BaseClass {    public abstract void add();} 被代理类 复制代码 代码如下: package staticpro

  • java利用反射实现动态代理示例

    复制代码 代码如下: package com.et59.cus.domain.dao.ex; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier; import org.apache.log4j.Logger;/** *  * <p>Title: ReflectUtil.java</p> * <p>Description: 反射&

  • java实现动态代理示例分享

    复制代码 代码如下: import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy; public class LogHandler implements InvocationHandler {    private Object delegate; public Object bind(Object delegate) {        this

随机推荐