`

动态代理 java

阅读更多

代理工具类

/**
 * 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动态代理demo

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解...

    Java 动态代理.md

    ### Java 动态代理 Java 动态代理是一种在运行时动态创建代理对象的技术,它在 Java 开发中被广泛应用,特别是在诸如 AOP(面向切面编程)的实现原理、RPC 远程调用、Java 注解对象获取、日志框架、全局性异常处理...

    JAVA静态代理和动态代理

    Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了动态代理的支持。 1. 定义接口: ```java public interface Service { void doSomething(); } ``` 2. 创建...

    java动态代理实例

    Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用真实目标对象的方法时添加额外的功能或行为。在这个实例中,我们将深入探讨Java动态代理的核心概念,...

    Java动态代理两种实现方式

    Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。这种技术常用于AOP(面向切面编程)和框架中,如Spring AOP,用于实现方法拦截、事务管理等功能。Java提供了两种...

    java + 动态代理 + 动态代理实际应用场景

    1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic进行通信) 3: 动态代理使用到基础理论:ClassLoader 加载.class字节码...

    示例代码:java动态代理和cglib代理的简单例子

    Java动态代理和CGLIB代理是两种常用的在Java中实现面向切面编程(AOP)的技术,它们允许我们在不修改原有代码的情况下,为方法添加额外的功能,如日志记录、性能监控、事务管理等。本篇文章将深入探讨这两种代理机制...

    Java实现动态代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...

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

    Java提供了动态代理机制,主要是通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的优点是可以在运行时动态创建代理对象,不需要预先编写代理类。下面是一个动态代理的...

    Java两种代理模式案例

    在Java中,代理模式有两种主要实现方式:静态代理和动态代理。下面将详细介绍这两种代理模式,并结合`ProxyDemo`案例进行说明。 ### 1. 静态代理 静态代理是最基础的代理形式,它通过显式创建一个代理类来实现对...

    Java动态代理helloworld

    在Java编程语言中,动态代理是一种强大的特性,它允许我们在运行时创建代理对象来扩展或增强已有类的功能。本篇文章将深入探讨Java动态代理的概念、原理以及如何通过一个简单的"Hello, World!"示例来理解它。 动态...

    java反射机制与动态代理

    ### Java反射机制与动态代理详解 #### 一、Java反射机制概述 Java反射机制是一种强大的工具,能够在程序运行时获取类的信息(如类名、字段、方法等)并操作它们。这种能力使得Java具备了一定程度上的动态性,极大...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    Java 动态代理详解(学习资料)

    JDK 动态代理JDK 提供了 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来支持动态代理。Proxy 类用于创建一个代理对象,而 InvocationHandler 接口则定义了代理对象的方法调用处理逻辑。...

    Java设计模式——代理设计模式(静态代理和动态代理)

    Java提供了一个内置的机制来实现动态代理,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 1. **定义接口**:与静态代理相同,我们依然需要一个业务接口`Service`。 2. **实现...

    Java静态代理与动态代理demo

    Java的 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口可以用来实现动态代理。 ```java // 动态代理示例 interface Service { void doSomething(); } // InvocationHandler 实现 ...

Global site tag (gtag.js) - Google Analytics