• 动态代理入门(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();
            
            
    
        }
    
    }
  • 相关阅读:
    VC6.0 error LNK2001: unresolved external symbol _main解决办法
    C++中数字与字符串之间的转换(使用CString.Format或者sprintf)
    C++内存管理(超长)
    Flash, Flex, Air, Flashplayer之间的相互关系是什么?
    《KVM虚拟化技术实战和原理解析》读书笔记(十几篇)
    HNCU1323:算法2-1:集合union (线性表)
    Delphi XE7下如何创建一个Android模拟器调试
    DelphiXE Android的所有权限按照分类总结说明
    DelphiXE8怎么使用调试模式(朱建强)
    C++静态库中使用_declspec(dllexport) 不能导出函数的问题
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/4006969.html
Copyright © 2020-2023  润新知