`

JAVA动态代理模式

    博客分类:
  • J2EE
 
阅读更多

这是我要实现的效果

 

 

public static void main(String[] args) {
		UserDao proxy  = (UserDao)   BeanProxyFactory.getProxyObject(UserDaoImpl.class.getName());
		proxy.save(new User());//我想实现保存的时候,自动调用一些动作
	} 

 

 

看代码

 

 

package org.dao;

import org.pojo.User;

public interface UserDao {
	public void save(User user);
	public void update(User user);

}

 

package org.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Transaction {
}

 

package org.dao.impl;

import org.annotation.Transaction;
import org.dao.UserDao;
import org.pojo.User;

@Transaction
public class UserDaoImpl implements UserDao {

	public void save(User user) {
		System.out.println("save user!" + user.getUserId());
	}

	public void update(User user) {
		System.out.println("save user!" + user.getUserId());
	}

}
 

package org.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

import org.annotation.Transaction;


public class MethodInvocationHandler implements InvocationHandler {
	private Object originalObject;
	private Set<String> transactionMethod = new HashSet<String>();

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;

		if (transactionMethod.contains(method.getName())) {
			System.out.println("事务开启");
			result = method.invoke(originalObject, args);
			System.out.println("事务结束");
		} else {
			result = method.invoke(originalObject, args);
		}
		return result;
	}

	public MethodInvocationHandler(Object originalObject) {
		this.originalObject = originalObject;
		for (Method m : originalObject.getClass().getMethods()) {
			if (m.isAnnotationPresent(Transaction.class)
					|| originalObject.getClass().isAnnotationPresent(
							Transaction.class)) {
				this.transactionMethod.add(m.getName());
			}
		}
	}
}

 

package org.aop;

import java.lang.reflect.Proxy;
import org.dao.UserDao;
import org.dao.impl.UserDaoImpl;
import org.pojo.User;

public class BeanProxyFactory {
	public static Object getProxyObject(String className) {
		Object proxyObject = null;
		try {
			Class claszz = Class.forName(className);
			MethodInvocationHandler handler = new MethodInvocationHandler(
					claszz.newInstance());
			proxyObject = Proxy.newProxyInstance(claszz.getClassLoader(),
					claszz.getInterfaces(), handler);
		} catch (Exception e) {
		}
		return proxyObject;
	}

	public static void main(String[] args) {
		UserDao proxy = (UserDao) BeanProxyFactory
				.getProxyObject(UserDaoImpl.class.getName());
		proxy.save(new User());// 我想实现保存的时候,自动调用一些动作
	}
}
 
分享到:
评论

相关推荐

    java 动态代理模式 适配器模式

    Java动态代理模式与适配器模式是两种在软件设计中常用的设计模式,它们都有各自的优点和应用场景。在Java中,动态代理模式主要依赖于Java的反射API和InvocationHandler接口,而适配器模式则用于解决不同接口之间的...

    JAVA动态代理模式.pdf

    Java动态代理模式是一种设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。在Java中,动态代理是利用反射机制实现的,可以在运行时动态生成代理类和对象。它主要应用于需要控制对象访问、提供额外功能...

    JAVA动态代理模式-.pdf

    JAVA动态代理模式-.pdf

    java动态代理 经典文章(word 2007格式的)

    - `Java动态代理模式.docx`可能详细讲解了动态代理模式的原理和实现,包括如何创建代理对象和实现`InvocationHandler`。 - `动态代理详解.docx`则可能深入讨论了Java动态代理的细节,包括实际应用场景和常见问题。...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    java装饰模式及动态代理模式示例源码

    装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...

    对代理模式与Java动态代理类的理解

    对代理模式与Java动态代理类的理解说明

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

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

    java静态代理、动态代理、装饰设计模式

    在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...

    java动态代理实例

    在这个实例中,我们将深入探讨Java动态代理的核心概念,以及如何利用它来实现拦截器模式。 首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    java + 动态代理 + 动态代理实际应用场景

    1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic进行通信) 3: 动态代理使用到基础理论:ClassLoader 加载.class字节码...

    Java 静态代理模式

    Java静态代理模式是一种设计模式,它允许我们为一个对象提供一个代理,以便增强或扩展其功能,...然而,由于其存在的局限性,如需更灵活的代理机制,可以考虑使用Java的动态代理模式(如Java.lang.reflect.Proxy)。

    java动态代理源代码

    代理模式是一种设计模式,它提供了一种在不修改原对象的情况下,对原对象功能进行扩展的方法。在Java中,静态代理和动态代理是两种常见的实现方式。动态代理则是在运行时生成代理类,无需预先编写代理类的源代码,...

    Java简单实现动态代理模式过程解析

    主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JAVA设计模式之代理模式实例

    在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的...

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

    在Java中,代理模式主要有静态代理和动态代理两种实现方式。 1. 静态代理:在编译时就已经确定了代理类与目标类的关系。通常,代理类会实现和目标类相同的接口,以便于在代理类中调用目标类的方法。这种方式的缺点...

Global site tag (gtag.js) - Google Analytics