Java中的代理(静态代理和动态代理)

本文介绍了Java中的代理概念,包括静态代理和动态代理。代理模式用于控制对对象的访问,常见作用包括远程代理、虚拟代理、缓冲代理、保护代理和智能引用。静态代理在编译时确定代理关系,而动态代理则在运行时动态生成。动态代理主要通过JDK的InvocationHandler和Proxy实现,或使用CGLIB库。AOP(面向切面编程)是动态代理的重要应用,用于隔离切面耦合,常用于日志记录、性能统计、安全控制等场景。
摘要由CSDN通过智能技术生成

一、代理的概念:

        定义:为其他对象提供一种代理,以控制对这个对象的访问。

        关于Java中的代理,有一种常用的设计模式---代理模式;对于代理,根据创建代理类的时间点的不同,又可以分为:静态代理和动态代理。

        代理模式,是一种常用的Java设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单地说,在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性可以附加多种用途,在实际开发中这种间接性会带来很多的便捷。

二、代理的作用:

1. 远程代理:为位于两个不同地址空间对象的访问提供一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。

2. 虚拟代理:通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。

3. 缓冲代理:为某个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间。

4. 保护代理:可以控制对一个对象的访问权限,为不同的用户提供不同级别的使用权限。

5. 智能引用:要为一个对象的访问(引用)提供一些额外的操作时可以使用。

三、静态代理:指预先确定了代理者与被代理者的关系,在编译期间就确定了代理类与被代理类之间的依赖关系。

        静态代理,由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口、被代理类、代理类等确定下来。在程序运行之前,代理类的 .class 文件就已经生成。

        代理模式最主要的就是有一个公共接口、一个具体的类、一个代理类,代理类持有具体类的实例,代为执行具体类实例方法。上面说到,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。这里的间接性就是指不直接调用实际对象的方法,那么我们在代理过程中就可以加上一些其他的用途。

/**
 * 共用接口
 */
public interface Person {
	public void working(String work);		// 工作
	public void goOutMethod(String method);		// 出行方式
}
/**
 * 学生类
 */
public class Student implements Person {
	@Override
	public void working(String work) {
		// TODO Auto-generated method stub
		System.out.println("工作内容是:"+work);
	}
	@Override
	public void goOutMethod(String method) {
		// TODO Auto-generated method stub
		System.out.println("出行方式是:"+method);
	}
}
/**
 * 老师类
 */
public class Teacher implements Person {
	@Override
	public void working(String work) {
		// TODO Auto-generated method stub
		System.out.println("工作内容是:"+work);
	}
	@Override
	public void goOutMethod(String method) {
		// TODO Auto-generated method stub
		System.out.println("工作内容是:"+method);
	}
}
/**
 * 代理类
 */
public class ProxyClass implements Person {
	Person person;	//要代理的对象

	// 代理类构造方法
	public ProxyClass(Person per) {
		this.person = per;
	}

	@Override
	public void working(String work) {
		// TODO Auto-generated method stub
		person.working(work);
	}

	@Override
	public void goOutMethod(String method) {
		// TODO Auto-generated method stub
		person.goOutMethod(method);
	}
}
/**
 * 创建代理对象的静态代理工厂类
 */
public class ProxyFactory {
	public static Person getProxyStudent(){
		return new ProxyClass(new Student());
	}
	
	public static Person getProxyTeacher(){
		return new ProxyClass(new Teacher());
	}
}
/**
 * 创建静态代理类实际的调用类
 */
public class MainClass {
	public static void main(String[] args) {
		System.out.println("=================================");
		ProxyFactory.getProxyStudent().goOutMethod("坐
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值