Java 反射-动态代理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tyzlmjj/article/details/51251727

转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/51251727
本文出自:【M家杰的博客】

概述
Java反射机制提供了动态代理的封装。动态代理可以对原本实现的方法进行附加操作,比如修改这个方法的返回值、修改传入的参数、在方法执行前后做别的操作或者干脆完全替换这个方法都是可以实现的,唯一的缺憾是只支持接口形式,所以如果需要用动态代理就需要写接口去约束。


动态代理简单实现

实现动态代理的关键类/接口
关键类
java.lang.reflect.Proxy
关键接口
java.lang.reflect.InvocationHandler

这里写一个简单的例子,主要分成4个Java文件

  • SayHello.java
    接口文件

  • Hello.java
    实现SayHello接口的实体类

  • HelloHandler.java
    实现InvocationHandler接口的实体类,并封装了代理的绑定等等的操作。

  • Main.java
    就是一个用于测试的主类


先来看接口,随便写个方法
SayHello.java

public interface SayHello
{
    String sayHello();
}

然后是实现SayHello接口的实体类
Hello.java

public class Hello implements SayHello
{
    @Override
    public String sayHello()
    {
        String hello = "Hello";
        System.out.println(hello);
        return hello;
    }
}

重点内容:实现InvocationHandler接口,并且封装了Proxy方法的实体类。
HelloHandler.java

public class HelloHandler implements InvocationHandler
{
    Object object;

    public HelloHandler(Object object)
    {
        this.object = object;
    }

    /**
     * 获取代理类
     * @return 代理类
     */
    public Object getProxy()
    {
        return Proxy.newProxyInstance(
                object.getClass().getClassLoader(),
                object.getClass().getInterfaces(),
                this);
    }

    /**
     * 在这里可以对被代理类中的所有方法进行操作<p>
     * 比如可以修改返回值、修改传入的参数、在方法调用前后做一些别的操作等等
     * @param proxy     代理类
     * @param method    方法
     * @param args      方法参数
     * @return          方法的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {
        Object result = null;

        before();

        //执行被代理类的方法
        result = method.invoke(object, args);

        after();

        //这里我修改了方法的返回值
        return result + " world!";
    }

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

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

然后就是测试类
Main.java

public class Main {

    public static void main(String[] args)
    {
        HelloHandler helloHandler = new HelloHandler(new Hello());

        SayHello sayHello = (SayHello) helloHandler.getProxy();

        System.out.println("return: " + sayHello.sayHello());
    }
}

测试输出结果:
动态代理

代码下载

代码我已经写的很简短了,不过还是提供个下载地址:【CSDN】

展开阅读全文

没有更多推荐了,返回首页