Core Java:使用java.lang.reflect实现JDK动态代理的小DEMO

代理模式在Java的体系结构中具有非常重要的地位,包括Spring的整个庞大的IOC体系都是建立在代理模式之上,而AOP也是在代理模式的基础上发展起来,增加了触发动作行为的时机。因此掌握代理模式是非常必要的技能。
    下面通过一个简单的DEMO,来探究一下java.lang.reflect是如何实现代理模式的,重点在main方法上,我们明明为flyImpl实现类的wing(String)赋值为null,但是最终的输出结果中,却发现这个flyImpl对象的fly域变成了“A injected swing value....”,这一切是如何发生的呢?

首先,定义一个接口类,fly,它具有两个方法,一个而是addWing,一个是fly。

package com.ziwen.vo;

public interface Flyable {
    public void addWing(String wing);
    public String fly();
}

编写一个实现类,LittleBird实现Flyable。

package com.ziwen.vo;

public class LittleBird implements Flyable {
    private String wing;

    public String getWing() {
        return wing;
    }

    public void setWing(String wing) {
        this.wing = wing;
    }

    @Override
    public void addWing(String wing) {
        setWing(wing);
    }

    @Override
    public String fly() {
        return "wing:"+getWing()+"...fly";
    }

}

按照JDK API的要求,需要有一个实现了Invocation的实现类:

package com.ziwen.vo;

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

public class ObjectHandler implements InvocationHandler {
    private Object target;
    public ObjectHandler(Object object){
        this.target = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        if("addWing".equals(method.getName())){
            args[0]="A injected swing value.";
        }
        return method.invoke(target, args);
    }

}

最后,编写一个工厂方法,用于获取代理类,简便起见,将main方法也写在里面。

package com.ziwen.vo;

import java.lang.reflect.Proxy;

public class FlyFactory {
    public static Flyable getFlayImpl() {
        Flyable fly = new LittleBird();
        return (Flyable) Proxy.newProxyInstance(
                fly.getClass().getClassLoader(), new Class[] { Flyable.class },
                new ObjectHandler(fly));
    }
    public static void main(String[] args) {
        Flyable fly = FlyFactory.getFlayImpl();
        fly.addWing(null);
        System.out.println(fly.fly());
    }
}

核心类说明:
    JDK提供了一个类,名字叫做Proxy.newProxyInstance(1,2,3)。其中,第一个参数是用于规定使用哪一个类的加载器?第二个参数是实现了哪些接口的数组,第三个参数是描述调用和它关联的一个invocationHandler的类型的对象。
    任何一个动态代理对象都要关联一个invocationHandler对象,只有这个对象才知道要代理什么事情。代理对象会调用invocationHandler中的invoke方法,这个invoke方法是被动态代理对象调用的,这样我们就可以扩展invoke方法,实现很多我们想做的事情。

时间: 2024-11-08 13:59:50

Core Java:使用java.lang.reflect实现JDK动态代理的小DEMO的相关文章

Java进阶之 JDK动态代理与Cglib动态代理

一.动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式[Proxy Pattern]), 动态代理类的字节码是在程序运行时由Java反射机制动态生成. 注意: 1.AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理 2.Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于AspectJ较差 二.JDK动态代理 [对有实现接口的对象做代理] 1.JDK动态代理中 需要了解的

JDK动态代理与Cglib动态代理(转载)

spring容器通过动态代理再结合java反射思想可以使得方法调用更加简洁 一.动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式[Proxy Pattern](博主), 动态代理类的字节码是在程序运行时由Java反射机制动态生成. 注意:       1.AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理 2.Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于Aspe

模拟JDK动态代理实现

JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层技术. JDK的动态代理主要涉及java.lang.reflect包中的两个类:Proxy和InvocationHandler.其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起.而Proxy为InvocationHa

拦截器(由JDK动态代理实现的拦截器)

要实现拦截器,首先我们需要定义几个类和接口 package com.xiawei.reflect.interceptor; public interface JavaBenDao { public void look();} ================================================== package com.xiawei.reflect.interceptor; public class JavaBenDaoImpl implements JavaBen

【转载】Java JDK 动态代理(AOP)使用及实现原理分析

转自:http://blog.csdn.net/jiankunking/article/details/52143504 版权声明:作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文版权归作者和CSDN共有 一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式UML图: 简单结构示意图: 为了保持

Java反射—运用反射生成jdk动态代理

1.  核心类&接口 在Java的java.lang.reflect包下提供一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成jdk动态代理类或动态代理对象. Proxy是所有动态代理类的父类,它提供了两个静态方法来创建动态代理类和动态代理对象,如下: ?  static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) ?  static Objec

Java学习之:JDK动态代理与CGLIB动态代理

代理的概念:简单的理解就是通过为某一个对象创建一个代理对象,我们不直接引用原本的对象,而是由创建的代理对象来控制对原对象的引用. 动态代理:是指在程序运行时由Java反射机制动态生成,无需手动编写代码.动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类. 代理原理:代理对象内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作

Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理

JDK动态代理的实现及原理 作者:二青 邮箱:[email protected]     微博:http://weibo.com/xtfggef 动态代理,听上去很高大上的技术,在Java里应用广泛,尤其是在Hibernate和Spring这两种框架里,在AOP,权限控制,事务管理等方面都有动态代理的实现.JDK本身有实现动态代理技术,但是略有限制,即被代理的类必须实现某个接口,否则无法使用JDK自带的动态代理,因此,如果不满足条件,就只能使用另一种更加灵活,功能更加强大的动态代理技术-- CG

Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)

一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法.如果公司卖多少钱,代理商也卖多少钱,那么代理商就赚不了钱.所以代理商在调用公司的卖方法后,加上自己的利润然后再把产品卖给客户.而客户部直接跟公司打交道,或者客户根本不知道公司的存在,然而客户最终却买到了产品. 专业点说:代理模式是对象的结构型模式,代码模式给某一个对象提供代理,并由代理对象控制原对象