`
lazyzhong
  • 浏览: 7531 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java——代理模式

    博客分类:
  • java
阅读更多

1、静态代理

由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

接口类:

package org.lazyzhong.test;

public interface People {
	public void speak();
	
	public void doWork();
}

 实现类:

package org.lazyzhong.test;

public class Man implements People{

	@Override
	public void speak() {
		System.out.println("I am man");
	}

	@Override
	public void doWork() {
		System.out.println("I do work");
	}
	
	
}

 代理类:

package org.lazyzhong.test;

public class PeopleProxy implements People{
	private Man man;
	
	public PeopleProxy() {
		super();
	}

	public PeopleProxy(Man man) {
		this.man = man;
	}

	@Override
	public void speak() {
		System.out.println("有请人类1/2的代表讲话。。。");
		man.speak();
		System.out.println("人类1/2的代表讲话完毕。。。");
	}

	@Override
	public void doWork() {
		
	}
	
	
}

 测试类:

		People p=new PeopleProxy(new Man());
		p.speak();

 输出:

有请人类1/2的代表讲话。。。
I am man
人类1/2的代表讲话完毕。。。

 

2、动态代理

在程序运行时,运用反射机制动态创建而成。

2.1 jdk动态代理

接口类,实现类和上面的一样。。。

代理类:

package org.lazyzhong.test;

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

public class MyProxy implements InvocationHandler{
	private Object target;
	
	public Object bind(Object target){
		this.target=target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),  target.getClass().getInterfaces(),this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable { //方法中的Proxy不是target,是虚拟的实现类。
	      Object result=null;  
	      System.out.println("事物开始");  
	      result=method.invoke(target, args);  
	      System.out.println("事物结束");  
	      return result;  
	}

}

 测试类:

		MyProxy proxy=new MyProxy();
		People p=(People)proxy.bind(new Man());
		p.speak();
		p.doWork();		

 输出:

事物开始
I am man
事物结束
事物开始
I do work
事物结束

JDK动态代理中包含一个类和一个接口: 
InvocationHandler接口: 
public interface InvocationHandler { 
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 

参数说明: 
Object proxy:指被代理的对象。 
Method method:要调用的方法 
Object[] args:方法调用时所需要的参数 

可以将InvocationHandler接口的子类想象成一个代理的最终操作类,替换掉ProxySubject。 

Proxy类: 
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法: 
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)  throws IllegalArgumentException 
参数说明: 
ClassLoader loader:类加载器 
Class<?>[] interfaces:得到全部的接口 
InvocationHandler h:得到InvocationHandler接口的子类实例

 

2.2 cglib动态代理:注意cglib是否和asm.jar版本冲突..这里用的是cglib-2.1.95和asm-3.3

实现类:

package org.lazyzhong.test;

public class Man{ //注意并没有实现接口

	public void speak() {
		System.out.println("I am man");
	}
	
}

 代理类:

package org.lazyzhong.test;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class MyCGProxy implements MethodInterceptor{

	private Object target;
	
	/**
	 *	创建代理对象 
	 * @param target
	 * @return
	 */
	public Object getInstance(Object target){
		this.target=target;
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(this.target.getClass());  
        // 回调方法  
        enhancer.setCallback(this);  
        // 创建代理对象  
        return enhancer.create();  
	}
	
	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
	      System.out.println("事物开始");  
	      proxy.invokeSuper(obj, args);  
	      System.out.println("事物结束");  
	      return null;
	}

}

 测试:

		MyCGProxy pro=new MyCGProxy();
		Man man=(Man)pro.getInstance(new Man());
		man.speak();

 输出:

事物开始
I am man
事物结束

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

 

分享到:
评论

相关推荐

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

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。

    设计模式实现——代理模式

    **设计模式实现——代理模式** 在软件工程中,设计模式是一种通用可重用的解决方案,它描述了在特定上下文中经常出现的问题以及该问题的解决方案。代理模式是设计模式的一种,它提供了一种对目标对象的间接访问方式...

    设计模式——代理模式

    此外,代理模式还可以利用动态代理技术,例如Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,这使得在运行时动态创建代理对象成为可能,而无需预先知道所有可能的代理类。...

    基于Java的设计模式-代理模式demo的实现(高分课设)

    基于Java的设计模式——代理模式demo的实现(高分课设)个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用...

    浅析Java设计模式【3】——代理.pdf

    ### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    Java与模式——源码

    5. **代理模式**:为其他对象提供一种代理以控制对该对象的访问,通常用于性能优化、权限控制或者远程调用等场景。 6. **适配器模式**:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能...

    java代理模式

    Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    3. **模式间的相互关系**:了解不同设计模式之间的关联和区别,比如装饰器和代理模式的区别,或者单例模式与静态内部类的实现差异。 4. **模式的优缺点**:评估每种模式的适用性和潜在问题,如过度设计或性能影响。 ...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    ### Java 代理模式详解 #### 1. 代理模式概览 代理模式是一种设计模式,主要目的是为了控制或提供对某对象的访问。在代理模式中,代理对象充当客户端与真实对象之间的中介,使得客户端可以通过代理对象间接地访问...

    设计模式——装饰模式

    在实际的IT开发中,装饰模式广泛应用于日志记录、性能统计、安全控制、事务管理等领域,如Spring AOP框架中的代理模式就是装饰模式的一个应用。通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,...

    java 设计模式 静态代理模式

    //代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...

    实例_ Java中的代理模式(csdn)————程序.pdf

    在Java中,代理模式有静态代理和动态代理两种实现方式。 ### 静态代理 静态代理是最基础的形式,它需要我们为每一个被代理的对象创建一个对应的代理类。在静态代理中,代理类通常会实现与被代理类相同的接口,以...

    design-pattern-java.pdf

    实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    课后习题参考答案部分涵盖了书中各个章节的关键知识点,包括创建型模式(如单例模式、工厂方法模式、抽象工厂模式)、结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)...

    设计模式-Java语言中的应用(pdf)

    而代理模式可以用来控制对原对象的访问,比如在访问前进行权限检查。 设计模式的应用不仅限于单一模式的使用,更多时候是多种模式的结合。比如,MVC(Model-View-Controller)模式在Web开发中广泛应用,其中模型、...

    经典的EJB模式——门面模式

    在实际应用中,门面模式可以结合其他设计模式一起使用,例如工厂模式用于创建EJB实例,代理模式用于提供额外的控制层等,以进一步优化系统的结构和性能。总的来说,门面模式是EJB开发中不可或缺的一个工具,它有效地...

Global site tag (gtag.js) - Google Analytics