结合上一篇文章(
自定义annotation 实现注入功能),里面模拟了一个拦截器。
发现在使用的时候都需要去调用SimilarToTheInterceptor.scanAllFieldsAndMethods 方法,
如果说有多个action需要注入,很显然这是种不好的设计。
TestAction action = new TestAction();
SimilarToTheInterceptor.scanAllFieldsAndMethods(action);// 模拟拦截器功能
action.saveDate1();
于是我想到使用java.lang.reflect.Proxy 去实现这个拦截器功能
正对前一篇文章的代码下面几个类需要改变
1.SimilarToTheInterceptor 该名称 ScanHelper 内容保持不变
2.增加一个新类,用来实现 拦截功能
package com.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Handler implements InvocationHandler {
private Object obj;
public Handler(Object obj) {
this.obj = obj;
}
public static Object newInstance(Object obj) {
System.out.println(obj.getClass().getName());
return java.lang.reflect.Proxy.newProxyInstance(obj.getClass()
.getClassLoader(), obj.getClass().getInterfaces(),
new Handler(obj));
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if(obj!=null){
ScanHelper.scanAllFieldsAndMethods(obj);// 注入
result = method.invoke(obj, args);
}
return result;
}
}
3,增加一个接口Action,然后TestAction去实现这个接口(由于proxy 必须要一个接口)
public interface Action {
public void saveDate1();
public void saveDate2();
}
3 ,测试
package com.test;
public class Main {
public static void main(String[] args) {
TestAction a = new TestAction();
Action action = (Action) Handler.newInstance(a);
action.saveDate1();
action.saveDate2();
}
}
4.结果
==========Saved======TestService_1 class was invoked
==========Saved======TestService_2 class was invoked
这样实现就很好的降低了耦合
分享到:
相关推荐
java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码
在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...
3. **Java动态代理**:基于`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,实现对目标对象的代理,用于拦截方法调用。 综上所述,`NoSuchMethodException`是Java编程中需要关注的一个重要异常...
这种技术主要基于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。在本文中,我们将深入探讨这两个关键组件以及如何使用它们来实现动态代理。 ### 1. Java动态代理的基本概念 ...
主要由java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler接口组成。 1. **Proxy类**:Proxy类的newProxyInstance()方法用于创建动态代理对象,它需要一个ClassLoader、一个接口数组和一个...
1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...
它使用java.lang.reflect包中的Proxy类和InvocationHandler接口来实现。1\. Proxy类:Proxy类提供了创建动态代理类和动态代理对象的功能。2\. InvocationHandler接口:每个代理对象都有一个关联的InvocationHandler...
在"InterfaceProxy"目录中,你可以看到如何利用`Proxy.newProxyInstance()`方法创建接口的代理对象,并通过实现`InvocationHandler`接口的`invoke()`方法来控制代理对象的行为。这种方式比静态代理更灵活,因为不...
Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。Proxy类用于生成代理对象,而InvocationHandler...
Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个实现了特定接口的代理对象,而InvocationHandler接口则定义了代理对象处理方法调用的...
Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了实现动态代理的基础设施。`InvocationHandler`接口定义了一个`invoke`方法,它会在代理对象调用原对象的方法时被触发。我们...
- `InvocationHandler`:实现了`java.lang.reflect.InvocationHandler`接口的对象,它定义了当代理对象的方法被调用时的行为。 2. **InvocationHandler接口**: `InvocationHandler`接口定义了一个方法`invoke()`...
首先,Java中的动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。`Proxy`类用于创建一个代理对象,而`InvocationHandler`接口则定义了处理代理对象的方法调用的逻辑...
我们需要提供一个实现了`java.lang.reflect.InvocationHandler`接口的类,然后使用`Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`方法创建代理对象。代理对象在调用方法时...
在Java中,有两种实现动态代理的方式:`java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口。 Proxy类是生成代理对象的工厂,而InvocationHandler接口定义了处理代理对象方法调用的逻辑。...
我们这里主要讨论的是动态代理,它基于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 在Java动态代理机制中,`Proxy`类是生成代理对象的工厂,而`InvocationHandler`接口定义了...
在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...
使用 JDK 动态代理时,需要实现 `InvocationHandler` 接口,并通过 `Proxy.newProxyInstance()` 方法创建代理对象。这种方法只能代理实现了接口的对象。 示例代码如下: ```java import java.lang.reflect....
通过以上分析,我们可以了解到Java动态代理是如何通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现的,以及它的基本应用场景和技术原理。这对于理解和使用AOP、RPC等高级特性有着...