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---------
分享到:
相关推荐
`Proxy`类是Java动态代理的核心,它提供了生成代理类和实例的静态方法。生成的代理类会实现目标类所实现的所有接口。`Proxy`类的主要方法有: - `Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, ...
在这个例子中,博主键盘太阳(keyboardsun)展示了如何通过Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来构建JDBC代理。 【标签】:“jdbc aop 代理 proxy” - JDBC:JDBC是...
`Proxy.newProxyInstance()`方法是生成代理对象的核心,它需要传入类加载器、接口数组和`InvocationHandler`实例。 `Proxy`类和`InvocationHandler`接口结合使用,可以轻松实现一些高级功能,例如: 1. **AOP...
Java代理类是面向切面编程(AOP)的一种实现方式,它允许我们在不修改原有代码的情况下,为已有的对象提供额外的功能。在这个“java proxy demo”中,我们将深入探讨如何利用Sun JDK API来创建和使用Java动态代理。 ...
在Java编程语言中,`Proxy`和`InvocationHandler`是两个关键的概念,它们主要用于实现动态代理,这是一种在运行时创建接口实例的技术。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。下面...
在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...
在`ProxyDemo.java`中,可能包含了一个具体的代理类实现和一个`InvocationHandler`的实现。代理类可能会包装一个具体的服务对象,并在调用方法前/后加入额外的操作。例如,一个简单的日志代理可能会在调用方法前后...
在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...
我们可以创建一个代理类`ProxyCarService`,同样实现`CarService`接口,然后在代理类中调用实际服务,并添加预处理和后处理操作。 ```java public interface CarService { void buyCar(); } public class ...
静态代理适用于代理类和被代理类关系固定的情况,而动态代理则适用于需要动态地创建代理对象,或者代理类和被代理类关系不确定的情况。在实际开发中,选择哪种代理方式取决于具体的需求和场景。例如,如果需要为多个...
在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...
首先,`java.lang.reflect.Proxy`是Java标准库中用于生成动态代理类的关键类。它允许我们创建一个新的接口实现类,而无需手动编写具体实现。这个新创建的代理类在运行时动态生成,并且在调用接口方法时,可以插入...
在这个“Java设计模式-代理模式例子”中,我们可能能看到如何创建静态代理类,以及如何利用`Proxy`和`InvocationHandler`创建动态代理。源码分析可以帮助我们更好地理解代理模式的实现细节,并能将其运用到自己的...
这个小例子适合初学者理解AOP和JDK Proxy的基本用法,对于经验丰富的开发者来说,可能更倾向于使用Spring AOP或其他高级AOP框架,它们提供了更为强大和灵活的特性。但无论如何,理解JDK Proxy的基本原理对掌握AOP...
这个新类就是代理类,它会自动实现所有接口的方法,并将方法调用委托给关联的InvocationHandler对象处理。 - 使用Proxy.newProxyInstance()静态方法可以创建代理对象。该方法需要三个参数:一个类加载器,一个接口...
在本例中,我们将探讨如何使用Java的内置API——java.lang.reflect包中的Proxy和InvocationHandler接口来创建动态代理。 首先,我们需要理解一个关键概念:代理。代理是目标对象的一个替代品,它在调用实际目标对象...
这个方法需要三个参数:代理类的类加载器、代理类需要实现的接口列表以及我们的`InvocationHandler`实例: ```java MyService realService = new RealService(); // 实现MyService接口的类 MyInvocationHandler ...
2. **JDK动态代理**:Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了动态生成代理对象的能力。在运行时,我们可以根据接口创建代理对象,而无需预先编写代理类。`...
2. **Proxy**:提供了一系列静态方法来创建动态代理类和实例。 #### 四、Java动态代理示例 ```java interface MyInterface { void doSomething(); } class MyInvocationHandler implements InvocationHandler { ...
以下是一个简单的例子,展示了动态代理类的创建和使用过程: 1. 目标类: 假设我们有一个UserService接口和它的实现类UserServiceImpl,如下: ```java interface UserService { void login(String username); ...