java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现,如下,List接口定义的业务方法,Vector是List接口的实现,VectorProxy 是InvocationHandler接口实现。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Vector;
public class VectorProxy implements InvocationHandler{
private Object proxyObj;
public VectorProxy(Object obj){
proxyObj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("Being calling method: " + method);
for(Object obj: args){
System.out.println(obj + " ");
}
Object o = method.invoke(proxyObj, args);
System.out.println("After class metrhod: " + method);
return o;
}
public static Object factory(Object obj){
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), new VectorProxy(obj));
}
public static void main(String[] args){
List v = null;
v = (List)factory(new Vector(10));
v.add("hello");
v.add("world");
}
}
输出:
Being calling method: public abstract boolean java.util.List.add(java.lang.Object)
hello
After class metrhod: public abstract boolean java.util.List.add(java.lang.Object)
Being calling method: public abstract boolean java.util.List.add(java.lang.Object)
world
After class metrhod: public abstract boolean java.util.List.add(java.lang.Object)
分享到:
相关推荐
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,从而在不修改原有类代码的情况下,扩展或增强原有类的功能。这里我们将深入探讨两个主要的Java动态代理...
5. **动态代理示例** - 首先,定义一个接口,如`MyService`,包含一些业务方法。 - 创建一个实现了`MyService`接口的目标对象,如`RealService`,实现接口中的方法。 - 实现`InvocationHandler`接口,重写`invoke...
下面是一个简单的动态代理示例: ```java interface MyService { void doSomething(); } class RealService implements MyService { @Override public void doSomething() { System.out.println("Real service...
- `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...
我们可以创建一个实现了该接口的实际服务类 `ServiceImpl`,然后使用动态代理来增强它的功能: ```java public class ServiceImpl implements Service { @Override public void doSomething() { System.out....
- **缓存机制**:在数据访问层,如果一个方法需要频繁访问数据库,可以使用动态代理在方法执行前先检查缓存,如果缓存中有结果则直接返回,避免了不必要的数据库访问。 - **事务管理**:动态代理可以用来管理事务...
"示例来理解Java动态代理: ```java // 目标接口 public interface HelloWorld { void sayHello(); } // 目标实现 public class HelloWorldImpl implements HelloWorld { @Override public void sayHello() { ...
4. **客户端使用动态代理** 在客户端代码中创建代理对象并调用方法: ```java Service realService = new RealService(); InvocationHandler handler = new MyInvocationHandler(realService); Service proxy ...
在提供的压缩包文件中,可能包含了一个简单的示例,展示了如何创建和使用动态代理。通过阅读和理解这个例子,你可以更深入地掌握动态代理的实现细节。如果你对某个部分有疑问,或者想要了解更多相关知识,可以参考...
使用Java动态代理的步骤: 1. 实现`InvocationHandler`:创建一个类实现`InvocationHandler`接口,重写`invoke()`方法。在这里可以添加预处理、后处理逻辑,或者转发调用给目标对象。 2. 定义接口:确定代理对象需要...
3. 创建并使用动态代理: ```java Service realService = new RealService(); Service proxyService = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class[]{Service.class}, new ...
总结起来,这个示例展示了如何利用Java的注解和动态代理技术为JavaBean添加额外的功能。通过注解,我们可以方便地标识需要进行特殊处理的方法,而动态代理则负责在运行时生成代理对象,使得在调用这些方法时能够执行...
以下是一个简单的Java动态代理示例: ```java public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target;...
然后,我们创建了两个代理类,一个使用Java动态代理,另一个使用CGLIB。在测试类中,我们创建了两个代理对象并调用`doSomething()`方法,可以看到在调用前后分别打印出了代理的信息。 总结,Java动态代理和CGLIB...
Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理通常用于实现AOP(面向切面编程)、事件...
在数据库连接池的例子中,动态代理可以用来创建一个代理数据库连接,这个代理在获取连接时,可以自动地进行连接池的管理和资源调度。 在实际的数据库连接池实现中,我们通常会有一个`ConnectionPool`类作为装饰器,...
JAVA动态代理的例子 一个简单的例子 初学者可以下载试试
// 动态代理示例 interface Service { void doSomething(); } // InvocationHandler 实现 class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { ...
下面是一个简单的动态代理示例: ```java interface MyService { void doSomething(); } class MyServiceImpl implements MyService { @Override public void doSomething() { System.out.println("Doing ...