代理工具类
/**
* created on Jan 13, 2010 9:34:18 AM *
* Copyright 2001-2010 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
/**
* @author *
*/
public class DynamicLogger implements InvocationHandler {
private Object target;
public Object newProxyObject(Object target) { // 在JVM中动态生成代理类
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
public DynamicLogger() {
}
/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
System.out.println("invoke method is "+method.getName());
Object result = method.invoke(target, args);
after();
// System.out.println(proxy);
return result;
}
private void before() {
System.out.println("now is " +new Date());
}
private void after() {
System.out.println("now is " +new Date());
}
}
接口
public interface IPerson {
void speak();
void walk();
}
实现
public class RealPerson implements IPerson {
private String name;
/**
* @param name
*/
public RealPerson(String name) {
super();
this.name = name;
}
/*
* (non-Javadoc)
*
* @see dynamicProxy.IPerson#speak()
*/
public void speak() {
System.out.println(name+ " is speak");
}
/*
* (non-Javadoc)
*
* @see dynamicProxy.IPerson#walk()
*/
public void walk() {
System.out.println(name+ " is walk");
}
}
测试
public class Client extends TestCase {
public void testProxy() throws Exception {
IPerson Warrior=new RealPerson("Warrior");
IPerson Priest=new RealPerson("Priest");
DynamicLogger log1=new DynamicLogger();
DynamicLogger log2=new DynamicLogger();
IPerson proxyWarrior=(IPerson) log1.newProxyObject(Warrior);
IPerson proxyPriest=(IPerson) log2.newProxyObject(Priest);
proxyWarrior.walk();
proxyWarrior.speak();
System.out.println("====");
proxyPriest.walk();
proxyPriest.speak();
}
}
输出
now is Wed Jan 13 10:05:59 CST 2010
invoke method is walk
Warrior is walk
now is Wed Jan 13 10:05:59 CST 2010
now is Wed Jan 13 10:05:59 CST 2010
invoke method is speak
Warrior is speak
now is Wed Jan 13 10:05:59 CST 2010
====
now is Wed Jan 13 10:05:59 CST 2010
invoke method is walk
Priest is walk
now is Wed Jan 13 10:05:59 CST 2010
now is Wed Jan 13 10:05:59 CST 2010
invoke method is speak
Priest is speak
now is Wed Jan 13 10:05:59 CST 2010
分享到:
相关推荐
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解...
### Java 动态代理 Java 动态代理是一种在运行时动态创建代理对象的技术,它在 Java 开发中被广泛应用,特别是在诸如 AOP(面向切面编程)的实现原理、RPC 远程调用、Java 注解对象获取、日志框架、全局性异常处理...
Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了动态代理的支持。 1. 定义接口: ```java public interface Service { void doSomething(); } ``` 2. 创建...
Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用真实目标对象的方法时添加额外的功能或行为。在这个实例中,我们将深入探讨Java动态代理的核心概念,...
Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。这种技术常用于AOP(面向切面编程)和框架中,如Spring AOP,用于实现方法拦截、事务管理等功能。Java提供了两种...
1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic进行通信) 3: 动态代理使用到基础理论:ClassLoader 加载.class字节码...
Java动态代理和CGLIB代理是两种常用的在Java中实现面向切面编程(AOP)的技术,它们允许我们在不修改原有代码的情况下,为方法添加额外的功能,如日志记录、性能监控、事务管理等。本篇文章将深入探讨这两种代理机制...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...
Java提供了动态代理机制,主要是通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的优点是可以在运行时动态创建代理对象,不需要预先编写代理类。下面是一个动态代理的...
在Java中,代理模式有两种主要实现方式:静态代理和动态代理。下面将详细介绍这两种代理模式,并结合`ProxyDemo`案例进行说明。 ### 1. 静态代理 静态代理是最基础的代理形式,它通过显式创建一个代理类来实现对...
在Java编程语言中,动态代理是一种强大的特性,它允许我们在运行时创建代理对象来扩展或增强已有类的功能。本篇文章将深入探讨Java动态代理的概念、原理以及如何通过一个简单的"Hello, World!"示例来理解它。 动态...
### Java反射机制与动态代理详解 #### 一、Java反射机制概述 Java反射机制是一种强大的工具,能够在程序运行时获取类的信息(如类名、字段、方法等)并操作它们。这种能力使得Java具备了一定程度上的动态性,极大...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...
JDK 动态代理JDK 提供了 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来支持动态代理。Proxy 类用于创建一个代理对象,而 InvocationHandler 接口则定义了代理对象的方法调用处理逻辑。...
Java提供了一个内置的机制来实现动态代理,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 1. **定义接口**:与静态代理相同,我们依然需要一个业务接口`Service`。 2. **实现...
Java的 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口可以用来实现动态代理。 ```java // 动态代理示例 interface Service { void doSomething(); } // InvocationHandler 实现 ...