zoukankan      html  css  js  c++  java
  • Java Web 静态代理和动态代理

    静态代理

    概述

    • 在编译时已经将接口、被代理类、代理类确定下来的代理方式
      • 代理类持有被代理类的实例
      • 代理类和被代理类implements相同接口
    • 代理的好处
      • 可以对原类的方法进行加强

    Demo

    • 接口
    package Proxy;
    
    /**
     * Person接口
     */
    public interface Person {
        //上交班费
        void giveMoney();
    }
    
    • 被代理类
    package Proxy;
    
    public class Student implements Person{
    	private String name;
    	public Student(String name){
    		this.name = name;
    	}
    
    	@Override
    	public void giveMoney(){
    		System.out.println(name + "上交班费50$");
    	}
    }
    
    • 代理类
    package Proxy;
    
    /**
     * 学生代理类,保留了一个学生实体,这样就可以调用实体的方法
     */
    public class StudentProxy implements Person{
    	Student stu;
    
    	public StudentProxy(Person stu){
    		//只代理学生对象
    		if(stu.getClass() == Student.class){
    			this.stu = (Student) stu;
    		}
    	}
    
    	//代理学生的交班费行为
    	public void giveMoney(){
    		//附加行为
    		System.out.println("mio is in progress!");
    
    		stu.giveMoney();
    	}
    }
    
    • 测试
    package Proxy;
    
    public class Main {
    	public static void main(String[] args){
    		Person s = new Student("mio");
    
    		Person monitor = new StudentProxy(s);
    
    		monitor.giveMoney();
    	}
    }
    

    动态代理

    概述

    • 在项目运行的时候创建一个代理对象,这种代理方式是动态代理
      • Proxy类 : Proxy.newProxyInstance()
      • Spring的cglib

    Demo

    • 接口
    package DynamicProxy;
    
    public interface Car {
    	void run();
    	void stop();
    }
    
    • 被代理类
    package DynamicProxy;
    
    public class SportsCar implements Car{
    	@Override
    	public void run() {
    		System.out.println("Sports car runs");
    	}
    
    	@Override
    	public void stop() {
    		System.out.println("Sports car stops");
    	}
    }
    
    • 动态代理(使用匿名内部类)
    package DynamicProxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class Main {
    	public static void main(String[] args){
    		final SportsCar sc = new SportsCar();
    
    		//sc.run();
    		//sc.stop();
    
    		Car SportsCarPro = (Car) Proxy.newProxyInstance(SportsCar.class.getClassLoader(), new Class[]{Car.class}, new InvocationHandler() {
    			@Override
    			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    				//method.invoke(sc,null);
    				if("run".equals(method.getName())){ //只加强特定的方法
    					System.out.println("run faster");
    				}
    				return method.invoke(sc,null);
    			}
    		});
    
    		SportsCarPro.run();
    		SportsCarPro.stop();
    	}
    }
    
  • 相关阅读:
    广通软件招聘-北京广通信达软件股份有限公司杭州分公司招聘-拉勾网
    广通软件
    Django – vicalloy's trac
    MyCAT常用分片规则之分片枚举
    django-extensions 文档 — django-extensions 1.2.5 文档
    Samba服务搭建 | Charlie's Blog
    Centos搭建Samba
    sqlite常用的命令-增删改查
    Win7 NFS 设置详解 | X-Space
    LabF nfs window client
  • 原文地址:https://www.cnblogs.com/yifeichongtian/p/13865357.html
Copyright © 2011-2022 走看看