`

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

阅读更多

Java动态代理——动态类Proxy的使用

1.什么是动态代理?

答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。
2.为什么使用动态代理?

答:因为动态代理可以对请求进行任何处理

3.使用它有哪些好处?

答:因为动态代理可以对请求进行任何处理
4.哪些地方需要动态代理?

答:不允许直接访问某些类;对访问要做特殊处理等

 

目前Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。 其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。

Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现

以下为模拟案例,通过动态代理实现在方法调用前后向控制台输出两句字符串

目录结构

 

定义一个HelloWorld接口

package main.aop;

/**
 * 定义一个HelloWorld接口
 * 
 * @author admin
 */
public interface IHelloWorld
{

    public void sayHelloWorld();

    /**
     * 业务处理A方法
     * 
     * @param name
     */
    void sayHello(String name);

    /**
     * 业务处理B方法
     * 
     * @param name
     */
    void sayGoogBye(String name);
}
 类HelloWorldImpl是HelloWorld接口的实现
package main.aop;

/**
 * 类HelloWorldImpl是HelloWorld接口的实现
 * 
 * @author admin
 */
public class HelloWorldImpl implements IHelloWorld
{

    public void sayHelloWorld()
    {
        System.out.println("HelloWorld!");
    }

    @Override
    public void sayHello(String name)
    {
        System.out.println("Hello " + name);
    }

    @Override
    public void sayGoogBye(String name)
    {
        System.out.println(name+" GoodBye!");
    }
}
 HelloWorldHandler是 InvocationHandler接口实现
package main.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 实现在方法调用前后向控制台输出两句字符串
 * 
 * @author admin
 */
public class HelloWorldHandler implements InvocationHandler
{

    // 要代理的原始对象
    private Object obj;

    public HelloWorldHandler(Object obj)
    {
        super();
        this.obj = obj;
    }

    /**
     * 在代理实例上处理方法调用并返回结果
     * 
     * @param proxy 代理类
     * @param method 被代理的方法
     * @param args 该方法的参数数组
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {
        Object result = null;
        // 调用之前
        doBefore();
        // 调用原始对象的方法
        result = method.invoke(obj, args);
        // 调用之后
        doAfter();
        return result;
    }

    private void doBefore()
    {
        System.out.println("before method invoke");
    }

    private void doAfter()
    {
        System.out.println("after method invoke");
    }

}

 测试类

package main.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class HelloWorldTest
{

    /**
     * 
     * @param args
     */
    public static void main(String[] args)
    {
        IHelloWorld helloWorld = new HelloWorldImpl();
        InvocationHandler handler = new HelloWorldHandler(helloWorld);

        // 创建动态代理对象
        IHelloWorld proxy = (IHelloWorld) Proxy.newProxyInstance(helloWorld.getClass().getClassLoader(),
                                                               helloWorld.getClass().getInterfaces(), handler);
        proxy.sayHelloWorld();
        
//        IHello hello = (IHello) new DynaProxyHello().bind(new Hello(), new LoggerOperation());
//        hello.sayGoogBye("Java Proxy");
//        hello.sayHello("Java Proxy");
    }
}

 

 

分享到:
评论

相关推荐

    java Proxy 动态代理

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

    Java动态代理实现 Proxy InvocationHandler

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

    java proxy demo 代理类的运用demo

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

    java动态代理demo

    `java.lang.reflect.Proxy` 类是用于创建动态代理对象的工厂类。我们需要使用`Proxy.newProxyInstance()`方法,传入类加载器、接口数组以及自定义的`InvocationHandler`实例,来生成代理对象。 5. **动态代理示例*...

    java动态代理实例

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

    java 简答可复用动态代理类

    在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。下面将详细解释这两个关键组件以及如何使用DOM4J库和CGLIB实现动态代理。 1. **Java动态代理原理** -...

    java动态代理实现详解

    1. `java.lang.reflect.Proxy`:这个类是Java动态代理的基石,提供了生成代理类和实例的方法。`newProxyInstance()`方法是关键,它接受类加载器、接口列表和一个实现了`InvocationHandler`的实例作为参数,返回代理...

    Java动态代理学习测试类

    这个“Java动态代理学习测试类”可以帮助我们理解和实践Java动态代理的原理和使用,进一步提升我们对Java语言特性的掌握。通过实际编写和运行代码,我们可以更直观地看到动态代理如何工作,从而更好地应用到实际项目...

    Java动态代理两种实现方式

    JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了处理代理对象方法调用的逻辑。 #### 1. 创建...

    java动态代理类的实例

    在给定的`autoProxy.txt`文件中,可能包含了一些关于如何自动配置和使用动态代理的例子或者更复杂的代理场景,例如CGLIB、JDK动态代理的选择、代理性能优化等内容。分析和理解这个文件的内容,可以帮助我们深入理解...

    java动态代理 经典文章(word 2007格式的)

    Spring AOP使用CGLIB(代码生成库)或Java动态代理来创建代理对象,对于没有实现接口的类,Spring会使用CGLIB。 6. **设计模式应用**: 动态代理可以用于实现如代理模式、装饰者模式等设计模式,为原对象添加额外...

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

    ### Java 动态代理Proxy应用和底层源码分析 #### 一、Java动态代理简介 Java动态代理是一种在运行时动态生成代理类的技术,通过该技术可以为一个或多个接口生成一个实现类,该实现类可以拦截接口方法的调用,并...

    java动态代理机制

    - **缓存机制**:在数据访问层,如果一个方法需要频繁访问数据库,可以使用动态代理在方法执行前先检查缓存,如果缓存中有结果则直接返回,避免了不必要的数据库访问。 - **事务管理**:动态代理可以用来管理事务...

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

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

    Java动态代理helloworld

    1. **Proxy类**:Proxy是Java动态代理的核心类,它提供了创建动态代理对象的方法。代理对象是目标对象的代理,当调用代理对象的方法时,实际上会调用`InvocationHandler`的`invoke()`方法。 2. **InvocationHandler...

    Java动态代理Proxy和cglib

    Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。这个主题将深入探讨这两个关键组件以及与之相关的CGLIB库。 ### 1. Java动态代理 #### 1.1 Proxy类 `Proxy`...

    java 动态代理 简单实例

    我们可以创建一个实现了该接口的实际服务类 `ServiceImpl`,然后使用动态代理来增强它的功能: ```java public class ServiceImpl implements Service { @Override public void doSomething() { System.out....

    Java动态代理语法Proxy类原理详解

    "Java动态代理语法Proxy类原理详解" Java动态代理语法Proxy类原理详解是Java语言中的一种非常重要的语法机制,它可以动态地生成代理对象,从而对目标对象进行增强和修改。本文将详细介绍Java动态代理语法Proxy类...

    Java代理模式Java动态代理

    4. **客户端使用动态代理** 在客户端代码中创建代理对象并调用方法: ```java Service realService = new RealService(); InvocationHandler handler = new MyInvocationHandler(realService); Service proxy ...

Global site tag (gtag.js) - Google Analytics