动态代理入门(jdk)

动态代理就是aop的核心,动态代理简单的就是通过创建一个代理对象,然后把原来的方法增强。很抽象,例子是王道。jdk中提供了动态代理的实现,但是它是针对接口,如果要实现动态代理,需要被代理对象的接口。这是它的缺点,不能为了实现动态代理,都要给被代理对象写个接口,在web开发中有时很麻烦,这样就出现了通过直接改变字节码,写个子类重写需要增强的方法,但是如果这个类中的方法定义为final,它也没办法了。

1.委托类需要实现的接口

1 package 动态代理;
2
3 public interface heelo {
4     String sayHello();
5      void sayGoodble();
6
7 }

2、委托类的具体实现

 1 package 动态代理;
 2
 3 public class HelloImpl implements heelo{
 4
 5     @Override
 6     public String sayHello() {
 7         // TODO Auto-generated method stub
 8         return "heelo";
 9
10     }
11
12     @Override
13     public void sayGoodble() {
14         // TODO Auto-generated method stub
15         System.out.println("goodBye");
16
17     }
18
19 }

3.handler(advice)

package 动态代理;

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

public class HelloHander implements InvocationHandler{

    HelloImpl hip=null; //传入被代理的对象
    public HelloHander(HelloImpl hip)
    {
        this.hip=hip;

    }
    @Override
    //
    public Object invoke(Object arg0, Method arg1, Object[] arg2)
            throws Throwable {

        // TODO Auto-generated method stub
        System.out.println("before  "+arg1.getName());
        Object res=arg1.invoke(hip, arg2);//被代理的对象原来的逻辑
        System.out.println("after  "+arg1.getName());
        return  res;
        //此处请注意啊,执行顺序。

    }

}

4.客户端

package 动态代理;

import java.lang.reflect.Proxy;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HelloImpl hl=new HelloImpl();//target,被代理的对象
        HelloHander hh=new HelloHander(hl);//创建一个处理器,类似advice
        //创建一个代理对象,为target的所有方法进行代理
        heelo h=(heelo) Proxy.newProxyInstance(hl.getClass().getClassLoader(), hl.getClass().getInterfaces(), hh);
        //调用sayHeelo方法
        System.out.println(h.sayHello());

        System.out.println();
        //调用sayBye
        h.sayGoodble();

    }

}
时间: 2024-10-10 02:01:36

动态代理入门(jdk)的相关文章

java动态代理(JDK和cglib)

转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,

《转》java动态代理(JDK和cglib)

该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建

《转》JAVA动态代理(JDK和CGLIB)

该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建

(转)java动态代理(JDK和cglib)

博文转自http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期

【设计模式】动态代理 && 模拟JDK动态代理

真正理解动态代理需要明白回答以下问题: 什么叫动态代理?怎么产生? 动态代理的作用?可配置的事务,权限控制,日志等等....只有你想不到,没有动态代理做不到. 下面来回答以上3个问题: 先说下静态代理: 方法:创建代理类,代理类包含被代理对象的方法并在被代理方法的前后加添加的方法. 创建代理类可以用继承接口或者聚合(implements)被代理对象的接口来实现,然后传入被代理对象的实例.其中聚合并继承好,使用继承的时候如果代理类需要嵌套代理类或者创建不同的代理类,需要创建不同的代理类.造成类泛滥

动态代理(JDK实现)

JDK动态代理,针对目标对象的接口进行代理 ,动态生成接口的实现类 !(必须有接口) public class ProxyDemo { //通过方法的返回值得到代理对象            方法参数是要增强的对象    public Object getProxyObject(final Object target) {                Object proxyObj = Proxy.newProxyInstance(   //调用Proxy类中的静态方法,创建代理对象     

动态代理之JDK Proxy浅析

反射:运行时动态实例化任何一个类. 看此文章前至少对JAVA反射有一定了解... Jdk动态代理的实现就是使用了反射机制,关键代码在Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h).可以看到该方法中的最后一个参数InvocationHandler,这是动态代理实现的另一个关键点. 直接上代码,接口.目标类.调用处理类: /** * @author longe * 目标类实现的

Java动态代理:JDK 和CGLIB、Javassist、ASM之间的差别 (详细)

class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的.具体class文件是怎样组织类信息的,可以参考 此博文:深入理解Java Class文件格式系列.或者是Java虚拟机规范. 下面通过一段代

JDK动态代理[2]----JDK动态代理的底层实现之Proxy源码分析

在上一篇里为大家简单介绍了什么是代理模式?为什么要使用代理模式?并用例子演示了一下静态代理和动态代理的实现,分析了静态代理和动态代理各自的优缺点.在这一篇中笔者打算深入源码为大家剖析JDK动态代理实现的机制,建议读者阅读本篇前可先阅读一下笔者上一篇关于代理模式的介绍<JDK动态代理[1]----代理模式实现方式的概要介绍> 上一篇动态代理的测试类中使用了Proxy类的静态方法newProxyInstance方法去生成一个代理类,这个静态方法接收三个参数,分别是目标类的类加载器,目标类实现的接口