`
- 浏览:
10487 次
- 性别:
- 来自:
西安
-
熟悉代理模式的基础上,首先使用反射实现动态调用某个对象的某个方法,目的就是某个对象某个方法可以进行配置,使用XML或者使用后缀名properties文件。
代码如下:
1
import java.lang.reflect.Method
2
public class ReflectUtils
{
3
private Class clazz; //目标对象的类
4
private Method method; //目标对象的方法
5
private Object target; //目标对象
6
private Object[] params; //目标方法的参数
7
8
public ReflectUtils(Object targer,String methodName,Object
params)
{
9
locateTarget(target,methodName,params);
10
}
11
public void locateTarget(Object target,String methodName,Object
params)
{
12
this.target = target; //绑定目标对象
13
this.clazz = target.getClass(); //绑定目标对象类
14
locateMethod(methodName,params);
15
}
16
public void locateMethod(String methodName,Object
params)
{
17
this.params=params;
18
Class[] cls = new Class[params.length()];
19
for(int i=0;i<params.length;i++)
{
20
cls[i]=params[i].getClass();
21
}
22
try
{
23
this.method = clazz.getMethod(methodName,cls); //组装好该方法类
24
}catch(Exception e)
{
25
}
26
}
27
public void invokeMethod()
{
28
try
{
29
this.method.invoke(target,params); //调用该方法
30
}catch(Exception e)
{
31
}
32
}
33
}
34
下面给出测试例子
35
/** *//**
36
*
37
* 定义一个接口
38
**/
39
public interface Crud
{
40
public void add(UserInfo user);
41
public void modify(UserInfo user);
42
public void delete(UserInfo user);
43
}
44
/** *//**
45
*
46
* 接口实现类
47
**/
48
public CrudImpl implements Crud
{
49
public void add(UserInfo user)
{
50
System.out.println("新增用户:"+new UserInfo("lx","25").getName());
51
}
52
public void modify(UserInfo user)
{
53
System.out.println("修改用户:"+new UserInfo("lx","25").getName());
54
}
55
public void delete(UserInfo user)
{
56
System.out.println("删除用户:"+new UserInfo("lx","25").getName());
57
}
58
}
59
/** *//**
60
*
61
* 定义横向切面的类
62
**/
63
public class Crosscutting
{
64
public void before()
{
65
System.out.println("前置");
66
}
67
public void after()
{
68
System.out.println("后置");
69
}
70
}
71
/** *//**
72
*
73
* 定义配置文件,使用parameters.properties文件
74
**/
75
method=modify
76
/** *//**
77
*
78
* 定义测试类
79
**/
80
public class Test
{
81
private static Crosscutting cut = new Crosscutting(); // 横切面的东西,可使用ioc进行配置
82
private static ReflectUtils rf_before = new ReflectUtils(cut, "before");
83
//这个cut就代表AOP里面的横切面 before代表织入点 同下
84
private static ReflectUtils rf_after = new ReflectUtils(cut, "after");
85
//前置通知
86
public void beforeActive(Object target,String methodName,object
params)
{
87
Class cls = target.getClass();
88
Method[] methods = cls.getDeclaredMethods();
89
for(int i=0;i<methods.length;i++)
{
90
if (methods[i].getName().equals(method))
{
91
rf_before.invokeMethod(); //使用上面自定义动态代理类调用横切面的before方法
92
new ReflectUtils(obj, method, params).invokeMethod(); //使用上面的动态代理类调用核心目标方法
93
}
94
}
95
}
96
//后置通知
97
public static void afterActive(Object obj, String method, Object
params)
{
98
Class cls = obj.getClass();
99
Method[] methods = cls.getDeclaredMethods();
100
for (int i = 0; i < methods.length; i++)
{
101
if (methods[i].getName().equals(method))
{
102
new ReflectUtils(obj, method, params).invokeMethod();
103
rf_after.invokeMethod();
104
}
105
}
106
}
107
//环绕通知
108
public static void aroundActive(Object obj, String method, Object
params)
{
109
Class cls = obj.getClass();
110
Method[] methods = cls.getDeclaredMethods();
111
for (int i = 0; i < methods.length; i++)
{
112
if (methods[i].getName().equals(method))
{
113
rf_before.invokeMethod();
114
new ReflectUtils(obj, method, params).invokeMethod();
115
rf_after.invokeMethod();
116
}
117
}
118
}
119
//main方法测试
120
public static void main(String[] args) throws Exception
{
121
Crud crud = new CrudImpl(); // 业务bean可使用IOC进行装配
122
UserInfo user = new UserInfo("lx", "25"); // 实体bean可以使用IOC进行装配
123
// 读取配置文件 获得要拦截的方法名字 相当于XML
124
InputStream is = Test.class.getResourceAsStream("parameters.properties");
125
Properties props = new Properties();
126
props.load(is);
127
String method = props.getProperty("method");
128
beforeActive(crud,method,user); //测试前置通知
129
afterActive(crud,method,user);//测试后置通知
130
//修改parameters.properties文件里面的method名字 比如add modify delete 那么就会对方法实现拦截调用横切面的方法 以上纯属自我摸索~
131
}
132
}
133
134
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...
C#支持特性(Attribute),可以定义自定义特性来表示切面,并在运行时通过反射找到并执行这些特性。这种方式简单易用,但可能会导致代码可读性下降,且需要在运行时解析特性,性能上可能不如前两者。 4. **拦截器...
1. 静态代理:通过Java反射API或者自定义接口实现,缺点是需要为每个目标类手动创建代理类。 2. 动态代理:Java提供两种动态代理方式,JDK动态代理和CGLIB代理。 - JDK动态代理:基于接口实现,适用于目标对象实现...
Spring AOP提供了三种实现方式:代理模式、AspectJ切面和注解驱动的切面。 1. **代理模式** Spring AOP的基础是动态代理,它可以创建目标对象的代理对象来实现切面功能。有两种代理方式:JDK动态代理和CGLIB代理。...
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
本篇文章将围绕如何利用.NET的 Emit 功能实现代理式AOP以及属性的自动装配进行深入探讨。 Emit 是.NET框架提供的一种动态方法生成技术,它允许程序员在运行时构建和执行Microsoft中间语言(MSIL)。通过Emit,我们...
代理(Proxy)是一种设计模式,主要用于在不修改原有对象的基础上增加额外的功能或行为。在Java中,静态代理可以通过定义一个代理类来实现,而动态代理则使用`java.lang.reflect.Proxy`类和`java.lang.reflect....
Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它通过代理模式实现了动态织入功能,使得开发者可以方便地进行横切关注点(如日志、事务管理、权限控制等)的处理,而不必侵入核心业务逻辑。本文将深入...
这主要通过代理模式实现,使得我们可以集中处理系统中横切关注点,如日志、事务管理、权限控制等,提高代码的可维护性和可复用性。 1. **AOP概念** - **切面(Aspect)**:切面是关注点的模块化,包含了横切关注点...
代理模式的应用非常广泛,例如在AOP(面向切面编程)中,代理模式用于实现切面逻辑,如事务管理、性能监控等。此外,还可以用于远程调用、安全控制、缓存等场景。 总结来说,Java设计模式中的代理模式提供了一种...
标题中的“基于事件(AOP)的concurrent线程池”是指一种...总结来说,基于事件的AOP线程池是一种创新的并发编程模式,它结合了AOP的强大功能和Java并发库的灵活性,使得在多线程环境中处理复杂逻辑变得更加简单和可控。
C#中实现AOP的一种方式是通过RealProxy类,这涉及到对.NET的反射和代理技术的深入理解。 RealProxy是.NET框架提供的一种机制,可以创建一个透明的代理类,用于在运行时控制对远程对象或本地对象的访问。在AOP上下...
- Spring AOP的实现涉及到反射、动态代理、代理模式等多个核心Java技术。 - `org.springframework.aop.framework.ProxyFactoryBean` 和 `org.springframework.aop.framework.JdkDynamicAopProxy` 是动态代理的关键...
编程方式**:通过自定义类实现Spring提供的AOP接口,如`MethodBeforeAdvice`、`AfterReturningAdvice`等。 #### 五、Spring AOP 的应用场景 Spring AOP广泛应用于以下场景: - **日志记录**:自动记录方法调用的...
1. **框架开发**: Spring、Hibernate等框架大量使用反射和动态代理技术,实现依赖注入、AOP等核心功能。 2. **元数据操作**: ORM框架如MyBatis通过反射快速映射数据库字段与Java对象。 3. **插件开发**: 如Junit...
- 代理模式:反射可用于动态创建代理类,实现对目标对象的透明拦截,从而实现AOP(面向切面编程)。 - 动态代理:System.Reflection.Emit命名空间的类允许在运行时构建类型,这对于创建动态代理或实现自定义的元...
Java中的动态代理、反射和拦截器是面向对象编程中非常重要的技术,它们在实现灵活性、扩展性和代码解耦方面发挥着关键作用。本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践...
在Java世界里,代理模式是一种常见的设计模式,它允许我们创建对象的代理来控制对原对象的访问。CGLib是Java中实现动态代理的一种方式,尤其是在Spring AOP(面向切面编程)中被广泛应用。 CGLib代理主要分为两种...
这个DLL可以包含静态方法、动态代理或其他实现AOP和装饰器模式的结构。 2. **加载DLL**:Unity并不直接支持动态加载DLL,但可以通过反射(Reflection)技术在运行时加载外部DLL。利用`Assembly.Load`或`Assembly....