Java——动态代理

简介:                     在静态代理中,我们在调用target类的时候,都是先拿到proxy类,因为proxy类中将target类作为了成员变量,并且跟target类继承了一样的接口,具有相同的方法,所以,在proxy类中,通过调用target类的方法来对目标类方法的执行前后插入特殊操作。


         

          在静态代理中,我们在调用target类的时候,都是先拿到proxy类,因为proxy类中将target类作为了成员变量,并且跟target类继承了一样的接口,具有相同的方法,所以,在proxy类中,通过调用target类的方法来对目标类方法的执行前后插入特殊操作。


         但是静态代理有俩缺点:1,代理类特别多,每增加一个target类,就要写一个代理;2,在proxy类中,可能我们需要插入的操作时相同的,这就造成了代码的重复。


             所以,通过引入反射,可以实现动态代理,以对静态代理进行改进。



/**
 * @ClassName: LogHandler
 * @Description: 用于创建代理类
 * @author 水田
 * @date 2015年12月8日 上午11:17:51
 */
public class LogHandler implements InvocationHandler {
    private Object targetObject;

    public Object newProxyInstance(Object targetObj) {
	this.targetObject = targetObj;
	/*
	 * 1,拿到类的classLoader
	 * 2,得到创建的类的接口
	 * 3,传入回调invoke方法所在类
	 * */
	return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),
		targetObj.getClass().getInterfaces(), this);
    }

    /*
     * (非 Javadoc) <p>Title: invoke</p> <p>Description: </p>
     * 
     * @param proxy
     * 
     * @param 调用方法信息
     * 
     * @param args:方法的参数数组
     * 
     * @return
     * 
     * @throws Throwable
     * 
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
     * java.lang.reflect.Method, java.lang.Object[])
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
	    throws Throwable {
	for (int i = 0; i < args.length; i++) {
	    System.out.println(args[i]);
	}
	try {
	    // 调用目标类的方法,返回一个object,如果方法没有返回值,则返回null
	    method.invoke(targetObject, args);
	} catch (Exception e) {
	    e.printStackTrace();
	    throw e;
	}

	System.out.println("start----->>>" + method.getName());
	return method.getName();
    }
}

       使用示例:


/* 动态代理示例 */
	LogHandler logHandler = new LogHandler();
	UserManager userManager = (UserManager) logHandler
		.newProxyInstance(new UserManagerImpl());
	userManager.addUser("2343254", "lhc");


       我们将target类中被调用方法执行前后要插入的操作放在回调函数invoke方法中,当使用代理类调用对应方法的时候,会直接进入invoke方法这里,使用method,和invoke第三个参数可以拿到被调用方法的信息。


        加入了动态代理之后,明显去掉了静态代理的两个小缺点。大笑





目录
相关文章
|
3月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
55 0
[Java]代理模式
|
2月前
|
Java
JAVA 静态代理 & 动态代理
【11月更文挑战第14天】静态代理是一种简单的代理模式实现,其中代理类和被代理类的关系在编译时已确定。代理类实现与被代理类相同的接口,并持有被代理类的实例,通过调用其方法实现功能增强。优点包括代码结构清晰,易于理解和实现;缺点是对于多个被代理类,需为每个类编写相应的代理类,导致代码量大增,维护成本高。动态代理则在运行时动态生成代理类,更加灵活,减少了代码冗余,但可能引入性能损耗和兼容性问题。
|
3月前
|
Java
深入理解Java动态代理
深入理解Java动态代理
98 1
|
3月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
3月前
|
设计模式 缓存 Java
从源码学习Java动态代理|8月更文挑战
从源码学习Java动态代理|8月更文挑战
|
6月前
|
缓存 Java 测试技术
day27:Java零基础 - 动态代理
【7月更文挑战第27天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
48 2
day27:Java零基础 - 动态代理
|
5月前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
360 0
|
5月前
|
设计模式 Java C++
揭秘!JDK动态代理VS CGLIB:一场关于Java代理界的‘宫心计’,你站哪队?
【8月更文挑战第24天】Java 动态代理是一种设计模式,允许在不改动原类的基础上通过代理类扩展功能。主要实现方式包括 JDK 动态代理和 CGLIB。前者基于接口,利用反射机制在运行时创建代理类;后者采用继承方式并通过字节码技术生成子类实现类的代理。两者在实现机制、性能及适用场景上有明显差异。JDK 动态代理适用于有接口的场景,而 CGLIB 更适合代理未实现接口的类,尽管性能更优但存在一些限制。开发者可根据需求选择合适的代理方式。
236 0
|
6月前
|
开发框架 Java Android开发
Java中的类反射与动态代理详解
Java中的类反射与动态代理详解
|
6月前
|
Java 数据安全/隐私保护
Java中的动态代理机制详解
Java中的动态代理机制详解