`

静态代理和动态代理

    博客分类:
  • Java
阅读更多

代理模式主要有两种:静态代理和动态代理

 

一、静态代理

1、先定义一个接口类

2、定义一个该接口的实现类

3、定义一个静态代理类

可以看出静态代理类有一个很不爽的缺点:

当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。

这就增加了代码的复杂度。动态代理就可以避免这个缺点

 

二、动态代理

 

动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。

 

动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类

注意:

动态代理类都需要实现InvocationHandler类,需要java.lang.reflect.InvocationHandler 接口和 java.lang.reflect.Proxy 类的支持

java.lang.reflect.InvocationHandler接口的定义如下:

public interface InvocationHandler {
			/**	Object proxy:被代理的对象
			Method method:要调用的方法	
			Object[] args:方法调用时所需要参数**/
	    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
	}

 java.lang.reflect.Proxy类的定义如下:

/**	CLassLoader loader:类的加载器
	Class<?> interfaces:得到全部的接口
	InvocationHandler h:得到InvocationHandler接口的子类的实例**/
	public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException;

 代码:

一、

1)、先定义一个接口类

	package ttitfly.proxy;    
   
	public interface HelloWorld {    
	    public void print();    
	//  public void say();    
	}

 2)、定义一个该接口的实现类

	package ttitfly.proxy;    
   
	public class HelloWorldImpl implements HelloWorld{    
	   
	    public void print(){    
	        System.out.println("HelloWorld");    
	    }    
	//  public void say(){    
	//      System.out.println("Say Hello!");    
	//  }    
	}    

 3)、定义一个静态代理类

	package ttitfly.proxy;    
   
	public class StaticProxy implements HelloWorld{    
	   
	    public HelloWorld helloWorld ;    
	    public StaticProxy(HelloWorld helloWorld){    
	        this.helloWorld = helloWorld;    
	    }    
	        
	    public void print(){    
	        System.out.println("Welcome");    
	        //相当于回调    
	        helloWorld.print();    
	    }    
	        
	//  public void say(){    
	//      //相当于回调    
	//      helloWorld.say();    
	//  }    
	}      

 4) 一个测试类:

	package ttitfly.proxy;    
	   
	public class TestStaticProxy {    
	   
	    public static void main(String[] args){    
	        HelloWorld helloWorld = new HelloWorldImpl();    
	        StaticProxy staticProxy = new StaticProxy(helloWorld);    
	        staticProxy.print();    
	            
	//      staticProxy.say();    
	    }    
	}   

 二、

代理类:

	package ttitfly.proxy;        
       
	import java.lang.reflect.InvocationHandler;        
	import java.lang.reflect.Method;        
	import java.lang.reflect.Proxy;        
	//动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类        
	public class DynamicProxy implements InvocationHandler{        
	            
	    private Object object;         
	    //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。    
	    //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法    
	    public Object bindRelation(Object object){         
	        this.object = object;        
	        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);         
	    }         
	    //拦截关联的这个实现类的方法被调用时将被执行        
	    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {         
	        System.out.println("Welcome");        
	        Object result = method.invoke(object, args);         
	        return result;        
	    }        
	       
	}

 测试类:

	package ttitfly.proxy;        
       
	public class TestDynamicProxy {        
	    public static void main(String[] args){        
	        HelloWorld helloWorld = new HelloWorldImpl();        
	        DynamicProxy dp = new DynamicProxy();        
	        //在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。        
	        HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);         
	        helloWorld1.print();         
	        helloWorld1.say();        
	            
	        //helloWorld2将不被拦截    
	        HelloWorld helloWorld2 = new HelloWorldImpl();    
	        helloWorld2.print();         
	        helloWorld2.say();    
	            
	    }        
	}

 -----------------------------------

 

public Filter getFilter(Class<? extends Filter> clazz) {

if(filters.isEmpty()){

return null;

}

for(Filter filter:filters){

if(clazz.isInstance(filter)){

return filter;

}

return null;

}

 

 

分享到:
评论

相关推荐

    JAVA静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...

    Spring的静态代理和动态代理

    总结来说,Spring的静态代理和动态代理都用于实现AOP,静态代理适用于简单场景,但需要手动编写代理类,而动态代理则更加灵活,可以在运行时动态创建代理对象,适用于接口众多的情况。了解和掌握这两种代理模式对于...

    Java设计模式——代理设计模式(静态代理和动态代理)

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...

    包含静态代理和动态代理demo代码

    在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...

    静态代理和动态代理Demo

    静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...

    Java静态代理和动态代理

    代理模式分为两种主要类型:静态代理和动态代理。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。这个代理类实现了与目标类相同的接口,并且在调用目标方法时添加额外的逻辑。以下是一个简单的...

    静态代理和动态代理的讲解和案例,有详细的注释

    本教程将深入探讨静态代理和JDK动态代理的概念、工作原理以及如何实现。 ### 静态代理 静态代理是在编译时就确定了代理类和目标类的关系。代理类和目标类通常都需要实现相同的接口,以便于在代理类中调用目标类的...

    静态代理和动态代理的例子

    代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...

    静态代理和动态代理简单实现代码

    总结来说,静态代理和动态代理都是为了在调用对象方法时添加额外的行为,但静态代理需要预先定义代理类,而动态代理可以在运行时动态创建代理对象。在某些场景下,如接口数量多或频繁变动时,动态代理更具优势,因为...

    java 静态代理和动态代理学习实例源码

    代理模式通常分为静态代理和动态代理两种类型,这两种代理方式各有特点,适用于不同的场景。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。代理类和真实目标类需要实现相同的接口,以便代理类...

    java静态代理和动态代理详解

    在Java中,代理主要分为静态代理和动态代理。 1. 静态代理: 静态代理是在编译时就已经明确代理类与被代理类关系的一种方式。为了实现静态代理,我们需要手动创建一个代理类,这个代理类通常会实现与被代理类相同的...

    Spring AOP的静态代理和动态代理,转移到调用处理器一个集中的方法中处理.docx

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 - **JDK动态代理**:基于接口的代理,要求被代理的类必须实现至少一个接口。动态代理通过实现`java.lang.reflect.InvocationHandler`接口并...

    java静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。首先,我们需要定义一个接口,比如`Car`,这个接口描述了汽车的行为: ```java public ...

    Java中的代理模式--静态代理和动态代理

    Java中的代理模式--静态代理和动态代理 Java中的代理模式--静态代理和动态代理

Global site tag (gtag.js) - Google Analytics