zoukankan      html  css  js  c++  java
  • Java代理模式

    Java代理模式 分为了三种 静态代理 动态代理 和 Cglib

    静态代理

      静态代理 和目标对象都需要实现目标相同的 某个接口或者父类

      代码

        //定义一个接口
    
      public interface UserInterface{
    
         void eat();
    
        }
    //定义一个目标对象
    public class User implments UserInterface{
    
             public  void eat(){
    
                System.out.println("eat apple")
    
         }  
    }                                     

      

    //定义一个静态代理
    public class StaticProxyUser implments UserInterface{
    
        priavte UserInterface user; 
       StaticProxyUser(User user){ 
    
        this.user=user; 
       } 
    
       public void eat(){
       user.eat(); 
      } 
    } 

    测试

    public class Test{
        public static void main(String[] args){
                User user = new User();
                StaticProxyUser spu = new StaticProxyUser(user);
                spu.eat();
        }
    
    }        

    静态代理的优缺点

      优点,不改变目标对象的情况下,添加功能

      缺点,必须实现接口或者父类,导致太多

    动态代理

      相比叫于静态代理,动态代理不需要继承接口或者父类,而且代理对象是在内存中建立(jdk java.lang.reflect.Proxy.newProxyInstance(....)方法有参数,这里省略了)

      代码

     

    
    
    //在上边接口 和 目标对象的基础上
    public class ProxyTest{
      private Object user;
        
        ProxyTest(User user){
    
            this.user=user
    
    }
        public class getProxy(){
          
          Proxy p = new Proxy;
        
          Object pp=p.newProxyInstance(user.getClass().getClassLoader(),
                       user.getClass().getInterfacer(),
                       new InvocationHandler(
                           public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
                         Object returnValue = method.invoke(usr, args);
                            retrun returnValue;
    }
    )
    )
        return pp; } }
    //测试类 
    public class Test() i{
        
          public static void main(String[] args){
                 UserInterface user = new User
            //此时就在内存中生成代理对象
                 UserInterface u =(UserInterface)ProxyTest(user).getProxyInstance();
               u.save();
        }
    }

    Cjlib代理

      目标对象可以不实现接口或者父类

      使用目标对象子类的方式实现代理

      底层是使用字节码处理框架ASM来转换字节码并且生成新的类

    //目标对象没有实现接口或者父类
    
    public class UserDao {
    
        public void eat() {
            System.out.println("eat apple");
        }
    }

      

    //创建代理,需要使用拦截器
    public class ProxyTest implements MethodInterceptor{
         private Object user;
    
        public ProxyFactory(Object user) {
            this.user = user;
        }
    
        //给目标对象创建一个代理对象
        public Object getProxyInstance(){
            //1.工具类
            Enhancer en = new Enhancer();
            en.setSuperclass(target.getClass());
            en.setCallback(this);
            //4.创建子类(代理对象)
            return en.create();
    
        }
    
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
           
            Object returnValue = method.invoke(user, args);
    
            return returnValue;
        }
    }
         
    }
  • 相关阅读:
    Mysql 库表
    Mysql (二)
    SQLAlchemy
    Mysql 测试题
    jquery
    抽屉 演示
    前端项目
    JavaScript
    Html Css  练习
    Pandas之DataFrame——Part 3
  • 原文地址:https://www.cnblogs.com/fjd-1004/p/11015984.html
Copyright © 2011-2022 走看看