`
- 浏览:
10223 次
- 性别:
- 来自:
西安
-
熟悉代理模式的基础上,首先使用反射实现动态调用某个对象的某个方法,目的就是某个对象某个方法可以进行配置,使用XML或者使用后缀名properties文件。
代码如下:
1import java.lang.reflect.Method
2public 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(){
28try{
29 this.method.invoke(target,params); //调用该方法
30 }catch(Exception e){
31 }
32}
33}
34下面给出测试例子
35/** *//**
36 *
37 * 定义一个接口
38 **/
39public 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 **/
48public 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 **/
63public 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 **/
75method=modify
76/** *//**
77 *
78 * 定义测试类
79 **/
80public 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方法测试
120public 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....
这主要通过代理模式实现,使得我们可以集中处理系统中横切关注点,如日志、事务管理、权限控制等,提高代码的可维护性和可复用性。 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....