`
aogu_xt
  • 浏览: 9382 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Proxy代理类和InvocationHandler的小例子。

阅读更多

Proxy只能代理接口,不能代理类。

网上好多都是以代理Connection接口为例子的。不过讲的很不清楚。

现在,我们来代理List接口,并截住List的toString()方法,做一下特殊的处理。

 

要想实现接口的代理,那么我们需要实现InvocationHandler接口的invoke方法。

 

以下是用来测试的类TestJava

import java.util.List;

public class JavaTest {

	public static void main(String[] args) {

		ListFactory lf = new ListFactory();
		List mylst = lf.getList();

		System.out.println(mylst.toString());
	}
}

 

 

下面就是实现了InvocationHandler接口的ListFactory类,我们取得List的实例,就是通过这个类来获取。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

public class ListFactory implements InvocationHandler {

	private final String TOSTRING_METHOD_NAME = "toString";

	/* 定义一个List的实例,并初始化。*/
	private List myList = new ArrayList();

	public ListFactory() {
	}

	/**
	 * 取得List实例的方法。
	 */ 
	public List getList() {

		/* 接管myList,也便截住myList(List接口)的方法。*/
		List lst = (List) Proxy.newProxyInstance(myList.getClass()
				.getClassLoader(), myList.getClass().getInterfaces(), this);

		return lst;
	}
	
	/**
	 * 实现InvocationHandler接口的invoke方法。
	 */
	public Object invoke(Object pxy, Method mthd, Object[] args)
			throws Throwable {

		Object obj = null;

		/* 覆盖List的toString()方法。*/
		if (TOSTRING_METHOD_NAME.equals(mthd.getName())) {
			obj = "---------toString method is recovered---------";
		} else {
			obj = mthd.invoke(myList, args);
		}
		return obj;
	}
}

 

 

以下是测试类的运行结果:

 

---------toString method is recovered---------

 

 

0
0
分享到:
评论

相关推荐

    Java动态代理实现 Proxy InvocationHandler

    `Proxy`类是Java动态代理的核心,它提供了生成代理类和实例的静态方法。生成的代理类会实现目标类所实现的所有接口。`Proxy`类的主要方法有: - `Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, ...

    jdbc proxy 代理类

    在这个例子中,博主键盘太阳(keyboardsun)展示了如何通过Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来构建JDBC代理。 【标签】:“jdbc aop 代理 proxy” - JDBC:JDBC是...

    InvocationHandler, Proxy机制

    `Proxy.newProxyInstance()`方法是生成代理对象的核心,它需要传入类加载器、接口数组和`InvocationHandler`实例。 `Proxy`类和`InvocationHandler`接口结合使用,可以轻松实现一些高级功能,例如: 1. **AOP...

    java proxy demo 代理类的运用demo

    Java代理类是面向切面编程(AOP)的一种实现方式,它允许我们在不修改原有代码的情况下,为已有的对象提供额外的功能。在这个“java proxy demo”中,我们将深入探讨如何利用Sun JDK API来创建和使用Java动态代理。 ...

    Proxy & InvocationHandler

    在Java编程语言中,`Proxy`和`InvocationHandler`是两个关键的概念,它们主要用于实现动态代理,这是一种在运行时创建接口实例的技术。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。下面...

    代理模式java代码 Proxy(5) 2个代理类

    在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...

    Proxy代理模式经典实例(绝对OOP)

    在`ProxyDemo.java`中,可能包含了一个具体的代理类实现和一个`InvocationHandler`的实现。代理类可能会包装一个具体的服务对象,并在调用方法前/后加入额外的操作。例如,一个简单的日志代理可能会在调用方法前后...

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

    在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...

    Proxy 代理模式

    我们可以创建一个代理类`ProxyCarService`,同样实现`CarService`接口,然后在代理类中调用实际服务,并添加预处理和后处理操作。 ```java public interface CarService { void buyCar(); } public class ...

    静态代理和动态代理的例子

    静态代理适用于代理类和被代理类关系固定的情况,而动态代理则适用于需要动态地创建代理对象,或者代理类和被代理类关系不确定的情况。在实际开发中,选择哪种代理方式取决于具体的需求和场景。例如,如果需要为多个...

    java Proxy 动态代理

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

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

    首先,`java.lang.reflect.Proxy`是Java标准库中用于生成动态代理类的关键类。它允许我们创建一个新的接口实现类,而无需手动编写具体实现。这个新创建的代理类在运行时动态生成,并且在调用接口方法时,可以插入...

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

    在这个“Java设计模式-代理模式例子”中,我们可能能看到如何创建静态代理类,以及如何利用`Proxy`和`InvocationHandler`创建动态代理。源码分析可以帮助我们更好地理解代理模式的实现细节,并能将其运用到自己的...

    Aop jdk proxy实现小例子

    这个小例子适合初学者理解AOP和JDK Proxy的基本用法,对于经验丰富的开发者来说,可能更倾向于使用Spring AOP或其他高级AOP框架,它们提供了更为强大和灵活的特性。但无论如何,理解JDK Proxy的基本原理对掌握AOP...

    动态代理例子

    这个新类就是代理类,它会自动实现所有接口的方法,并将方法调用委托给关联的InvocationHandler对象处理。 - 使用Proxy.newProxyInstance()静态方法可以创建代理对象。该方法需要三个参数:一个类加载器,一个接口...

    11 动态代理的例子

    在本例中,我们将探讨如何使用Java的内置API——java.lang.reflect包中的Proxy和InvocationHandler接口来创建动态代理。 首先,我们需要理解一个关键概念:代理。代理是目标对象的一个替代品,它在调用实际目标对象...

    java动态代理类的实例

    这个方法需要三个参数:代理类的类加载器、代理类需要实现的接口列表以及我们的`InvocationHandler`实例: ```java MyService realService = new RealService(); // 实现MyService接口的类 MyInvocationHandler ...

    Proxy 模式学习代码

    2. **JDK动态代理**:Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了动态生成代理对象的能力。在运行时,我们可以根据接口创建代理对象,而无需预先编写代理类。`...

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

    2. **Proxy**:提供了一系列静态方法来创建动态代理类和实例。 #### 四、Java动态代理示例 ```java interface MyInterface { void doSomething(); } class MyInvocationHandler implements InvocationHandler { ...

    代理类,详细讲解一下动态代理类

    以下是一个简单的例子,展示了动态代理类的创建和使用过程: 1. 目标类: 假设我们有一个UserService接口和它的实现类UserServiceImpl,如下: ```java interface UserService { void login(String username); ...

Global site tag (gtag.js) - Google Analytics