`
leh627
  • 浏览: 23329 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

利用java.lang.reflect.Proxy 实现代理

阅读更多
结合上一篇文章(自定义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.lang.reflect.Proxy 学习资料 讲解 例子 源码

    Java.lang.reflect 包下常用的类及方法简介

    在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...

    java 请求的方法不存在(NoSuchMethodException)

    3. **Java动态代理**:基于`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,实现对目标对象的代理,用于拦截方法调用。 综上所述,`NoSuchMethodException`是Java编程中需要关注的一个重要异常...

    Java动态代理实现 Proxy InvocationHandler

    这种技术主要基于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。在本文中,我们将深入探讨这两个关键组件以及如何使用它们来实现动态代理。 ### 1. Java动态代理的基本概念 ...

    java reflect and dynamic proxy .Java反射和动态代理

    主要由java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler接口组成。 1. **Proxy类**:Proxy类的newProxyInstance()方法用于创建动态代理对象,它需要一个ClassLoader、一个接口数组和一个...

    java反射(reflect)

    1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...

    java之代理.pdf

    它使用java.lang.reflect包中的Proxy类和InvocationHandler接口来实现。1\. Proxy类:Proxy类提供了创建动态代理类和动态代理对象的功能。2\. InvocationHandler接口:每个代理对象都有一个关联的InvocationHandler...

    proxy.rar java三种代理模式源码

    在"InterfaceProxy"目录中,你可以看到如何利用`Proxy.newProxyInstance()`方法创建接口的代理对象,并通过实现`InvocationHandler`接口的`invoke()`方法来控制代理对象的行为。这种方式比静态代理更灵活,因为不...

    java-用Java动态代理实现AOP.pdf

    Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。Proxy类用于生成代理对象,而InvocationHandler...

    java使用动态代理来实现AOP(日志记录)的实例代码共6

    Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个实现了特定接口的代理对象,而InvocationHandler接口则定义了代理对象处理方法调用的...

    Java动态代理自建注解

    Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了实现动态代理的基础设施。`InvocationHandler`接口定义了一个`invoke`方法,它会在代理对象调用原对象的方法时被触发。我们...

    Java动态代理[动态类Proxy的使用]

    - `InvocationHandler`:实现了`java.lang.reflect.InvocationHandler`接口的对象,它定义了当代理对象的方法被调用时的行为。 2. **InvocationHandler接口**: `InvocationHandler`接口定义了一个方法`invoke()`...

    Java动态代理ReflectProxyDemo

    首先,Java中的动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。`Proxy`类用于创建一个代理对象,而`InvocationHandler`接口则定义了处理代理对象的方法调用的逻辑...

    JAVA的反射机制与动态代理.pdf

    我们需要提供一个实现了`java.lang.reflect.InvocationHandler`接口的类,然后使用`Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`方法创建代理对象。代理对象在调用方法时...

    反射和动态代理(reflect and proxy)---含源码

    在Java中,有两种实现动态代理的方式:`java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口。 Proxy类是生成代理对象的工厂,而InvocationHandler接口定义了处理代理对象方法调用的逻辑。...

    java proxy demo 代理类的运用demo

    我们这里主要讨论的是动态代理,它基于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 在Java动态代理机制中,`Proxy`类是生成代理对象的工厂,而`InvocationHandler`接口定义了...

    java Proxy 动态代理

    在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...

    Java 动态代理.md

    使用 JDK 动态代理时,需要实现 `InvocationHandler` 接口,并通过 `Proxy.newProxyInstance()` 方法创建代理对象。这种方法只能代理实现了接口的对象。 示例代码如下: ```java import java.lang.reflect....

    Java 动态代理Proxy应用和底层源码分析.pdf

    通过以上分析,我们可以了解到Java动态代理是如何通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现的,以及它的基本应用场景和技术原理。这对于理解和使用AOP、RPC等高级特性有着...

Global site tag (gtag.js) - Google Analytics