`

Java代理总结

    博客分类:
  • Java
阅读更多

Java代理机制 分类:

 

静态代理:继承代理【基于抽象类的代理】

               聚合代理【基于接口的代理】

 

动态代理:jdk代理【只针对接口,不能针对类】

               cglib代理【针对类实现代理,主要对指定的类产生一个子类,并且覆盖其中的方法实现类增强,因为采取的是继承的方式,无法对final类进行代理,hibernate使用的是cglib代理】

 

 

1.  聚合代理

 

package proxy2;
/**
 *************************************
  * @Title   Movable.java
  * @Author  张作强
  * @Date    2010-8-22
  * @Comment 聚合代理是基于接口的代理,先声明接口
 *************************************
 */
public interface Movable {
	void move();
}

 

package proxy2;

import java.util.Random;
/**
 *************************************
  * @Title   Tank.java
  * @Author  张作强
  * @Date    2010-8-22
  * @Comment 被代理的实体类,实现接口
 *************************************
 */
public class Tank implements Movable {
	
	public void move() {
		long begin=System.currentTimeMillis();
		System.out.println("Tank Moving");
		try {
			Thread.sleep(new Random().nextInt(10000));
		} catch (InterruptedException e) {
				e.printStackTrace();
			}
			long end=System.currentTimeMillis();
			System.out.println("Tank Move :"+(end-begin));
		}
}

 

package proxy2;
/**
 *************************************
  * @Title   TankTranProxy.java
  * @Author  张作强
  * @Date    2010-8-22
  * @Comment 代理的实现1,在调用被代理类的方法前后实现事物操作
 *************************************
 */
public class TankTranProxy implements Movable {
	
	Movable tank;
	
	//实现接口
	public void move() {
		System.out.println("Begin Transaction....");
		//这里调用的是构造函数传递过来的实现了接口的类
		tank.move();
		System.out.println("End Transaction....");
	}
	
	//构造函数,将实现接口的对象作为参数传递给构造函数
	public TankTranProxy(Movable tank) {
		super();
		this.tank = tank;
	}
}

 

package proxy2;
/**
 *************************************
  * @Title   TankLogProxy.java
  * @Author  张作强
  * @Date    2010-8-22
  * @Comment 代理的实现2,在调用被代理类的方法前后实现日志操作
 *************************************
 */
public class TankLogProxy implements Movable {
	
	Movable t;
	
	public TankLogProxy(Movable m) {
		super();
		this.t = m;
	}
	
	public void move() {
		System.out.println("Loging....");
		t.move();
		System.out.println("End Loging.....");
	}
}

 

package proxy2;

public class TestMain {
	public static void main(String[] args) {
		
		Tank tank=new Tank();
		
		//在执行被代理类之前先进行事务操作
		Movable tankTran=new TankTranProxy(tank);
		
		//在执行被代理类之前先进行日志操作
		Movable tankLog=new TankLogProxy(tankTran);
		
		//注:也可以把以上两行代码反过来些,就在执行被代理类之前先执行日志操作,然后进行事务操作
		//然后再执行被代理类的方法
		tankLog.move();
	}
}

 

结果:

Loging....

Begin Transaction....

Tank Moving

Tank Move :8375

End Transaction....

End Loging.....

 

2.  继承代理

 

package proxy3;

//被代理的类
public abstract class Tank {
	
	public void move(){
		System.out.println("Tank Moving... ");
	}
}

 

package proxy3;

public class TankProxy extends Tank {
	
	//以继承的方式实现代理
	
	//重写父类的方法
	public void move(){
		
		long start = System.currentTimeMillis();
		System.out.println("Before Moving:" + start);
		
		//注:该处调用的是Tank类的move,所以是代理Tank类的方法
		super.move();
		long end = System.currentTimeMillis();
		System.out.println("After Moving:" + end);
		System.out.println("您共运行了:" + (start - end) + "毫秒");
	}
}

 

package proxy3;

public class Test {
	public static void main(String[] args) {
		TankProxy tankProxy = new TankProxy();
		tankProxy.move();
	}
}

 

结果:

Before Moving:1282459642796

Tank Moving... 

After Moving:1282459642796

您共运行了:0毫秒

 

3.  jdk动态代理

 

package proxy4;

// jdk动态代理是基于接口实现的,第一步,先定义接口
public interface UserManager {
	void save(String name,String password);
	void delUser(int id);
}

 

package proxy4;

//被代理的类实现接口
public class UserManagerImpl implements UserManager {

	public void save(String name, String password) {
		System.out.println("UserManagerImpl.save..用户名:" + name
							+ "用户密码:" + password);
	}

	public void delUser(int id) {
		System.out.println("UserManagerImpl.delUser..用户ID:"+id );
	}
}

 

package proxy4;

//在执行被代理类的方法时,插入安全检查的类
public class Security {
	
	public void securityCheck(){
		System.out.println("security Checking...");
	}
}

 

package proxy4;

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

public class UserManagerProxy implements InvocationHandler {
	
	UserManager userManager;
	
	//生成代理类
	public Object getUserManagerProxy(UserManager userManager){
		this.userManager = userManager;
		return Proxy.newProxyInstance(userManager.getClass().getClassLoader(),
									  userManager.getClass().getInterfaces(), this);
	}
	
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		System.out.println("----------------- 参数列表  -----------------");
		for (int i = 0; i < args.length; i++) {
			System.out.println(args[i]);
		}


		System.out.println("----------------- 调用的方法  -----------------");
		System.out.println(method.getName());

		System.out.println("----------------- 安全检查  -----------------");
		Security security = new Security();
		security.securityCheck();

		System.out.println("----------------- 执行方法  -----------------");
		Object object=method.invoke(userManager, args);
		System.out.println("\n--------------------------------—-------\n");
		return object;
	}
}

 

package proxy4;

public class Test {
	public static void main(String[] args) {
		
		//这里必须使用接口进行类型转换
		UserManager userManager=(UserManager)new UserManagerProxy().
								getUserManagerProxy(new UserManagerImpl());
		userManager.save("张三","123456");
		userManager.delUser(3);
	}
}

 

结果:

----------------- 参数列表  -----------------

张三

123456

----------------- 调用的方法  -----------------

save

----------------- 安全检查  -----------------

security Checking...

----------------- 执行方法  -----------------

UserManagerImpl.save..用户名:张三用户密码:123456

 

--------------------------------—-------

 

----------------- 参数列表  -----------------

3

----------------- 调用的方法  -----------------

delUser

----------------- 安全检查  -----------------

security Checking...

----------------- 执行方法  -----------------

UserManagerImpl.delUser..用户ID:3

 

--------------------------------—-------

 

4.  cglib动态代理

 

cglib代理必须先引入包:cglib.jar或者别的版本

 

分享到:
评论

相关推荐

    java代理模式总结

    Java代理模式是一种设计模式,它允许我们为现有的对象创建一个代理对象,以便在不修改原对象的情况下增强或扩展其功能。这种模式在处理需要添加额外逻辑但又不想修改原始类的场景时尤其有用,比如日志、事务管理、...

    lotus domnio java代理输出html代理

    总结来说,`JQueryReportToolJavaAgent`是一个在Lotus Domino环境中运行的Java代理,它负责生成HTML响应,为XPage提供jQuery报告数据。它涉及到的主要知识点包括: 1. Lotus Domino Java代理的使用。 2. 使用`...

    java代理机制 JDK动态代理和cglib代理 详解

    Java代理机制是Java编程中一个重要的特性,它允许我们在不修改原有代码的基础上,为已有类增加额外的功能。本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口...

    lotus domnio java代理传值

    总结来说,"lotus domnio java代理传值"涉及Java编程,主要关注如何在Lotus Domino环境中通过Java代码创建代理、处理参数传递和权限管理。理解这些概念对于开发高效、安全的Lotus Domino应用程序至关重要。在实际...

    JAVA静态代理和动态代理

    总结来说,Java的静态代理适用于代理类较少且代理逻辑相对固定的情况,而动态代理则在代理类数量不确定或者代理逻辑可能变化时更为合适。两者都可以实现为原始对象添加附加功能,但动态代理在灵活性和代码维护方面...

    java代理模式

    总结来说,Java代理模式在软件设计中有着广泛的应用,如日志记录、性能监控、权限控制等场景。通过合理运用代理模式,可以提高代码的灵活性和可扩展性,同时避免对原始代码进行大量修改。了解并掌握代理模式,对于...

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

    总结来说,无论是静态代理还是动态代理,它们都是为了在不修改原始对象的情况下,为对象添加额外功能或控制对象的访问。静态代理适用于代理逻辑相对简单且固定的场景,而动态代理则更灵活,适用于需要动态生成代理...

    Java静态代理与动态代理demo

    总结来说,Java的静态代理和动态代理都能实现对目标对象的代理,但静态代理需要手动创建代理类,适用于目标类数量固定且已知的情况;而动态代理则在运行时生成代理类,更加灵活,尤其适合处理数量不确定或动态变化的...

    java知识体系总结

    Java知识体系总结 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年推出。它以其“一次编写,到处运行”的特性闻名,适用于开发跨平台的应用程序,包括桌面应用、企业...

    java获取浏览器代理设置

    总结来说,Java获取浏览器代理设置是一个涉及操作系统交互的过程,可以通过JNI或第三方库来实现。`registry.jar`和`ICE_JNIRegistry.dll`的组合提供了一种可能的实现途径,即通过读取Windows注册表来获取浏览器的...

    JAVA代理

    总结一下,`JAVA代理`涉及到的主要知识点包括: 1. **静态代理**:手动创建代理类,通过代理类对目标对象进行方法调用的拦截和增强。 2. **动态代理**:利用Java的`Proxy`类和`InvocationHandler`接口,动态地创建...

    java之代理.pdf

    Java代理主要分为静态代理和动态代理。静态代理需要目标对象和代理对象都实现相同的接口,代理对象在编译时就已经确定,适用于简单场景。动态代理则更灵活,代理类和代理对象在运行时动态生成,不需要预先定义接口,...

    Java动态代理两种实现方式

    总结来说,Java动态代理为开发者提供了灵活的代码扩展机制,可以根据实际需求选择适合的实现方式。JDK动态代理适用于接口丰富的场景,而Cglib更适合对性能有较高要求或者目标对象无法实现接口的情况。

    Java 动态代理详解(学习资料)

    总结Java 动态代理为我们提供了在运行时创建代理对象的能力,减少了代码的冗余,提高了代码的灵活性。JDK 动态代理适用于目标类实现接口的情况,而 CGLIB 则可以处理无接口的类。了解和掌握动态代理技术对于深入理解...

    Java实现动态代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有...希望这个总结能对你有所帮助,无论是学习还是工作中,理解并掌握动态代理都能让你在处理复杂系统时游刃有余。

    java socket编写的上网代理

    总结来说,这个项目是利用Java Socket实现了一个简单的HTTP代理服务器,用户可以通过配置浏览器的代理设置来使用它。尽管它可能不包含复杂的功能,如缓存、身份验证或协议转换,但对于学习网络编程和理解HTTP代理...

    Java设计模式-代理模式例子

    Java设计模式是软件开发中的一种重要思想,它总结了在解决特定问题时代码组织和复用的优秀实践。代理模式是这些模式中的一种,它的主要作用是在不改变原有对象行为的前提下,为对象添加额外的功能或者控制访问。在这...

    Java精华总结_JAVA精华总结_

    6. **反射**:Java反射机制允许程序在运行时动态地获取类的信息并操作类的对象,包括创建对象、调用方法、访问字段等,常用于插件系统、序列化、动态代理等领域。 7. **JVM原理**:理解Java虚拟机的工作原理,包括...

    java 动态代理 简单实例

    总结来说,Java动态代理是一种强大的工具,它允许我们在运行时动态创建代理类,实现对已有接口的方法增强。通过`Proxy`和`InvocationHandler`,我们可以轻松地插入如日志、事务管理等通用功能,而无需修改原有代码,...

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...

Global site tag (gtag.js) - Google Analytics