• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Java 动态代理

java 来源:@一头雾水@ 10次浏览

1、介绍。

Java代理。

        java代理:在不用修改源码的情况下,可以在实现类方法的前后做些额外的处理。

  1)、静态代理。

        在程序运行前,代理类的.class文件已存在。事先知道要代理的实现类是什么。

        优点:不需要知道委托类(实现类),只需知道代理类即可。

        缺点:(1)代码重复。代理类和委托类(实现类)实现了相同的接口。
                   (2)维护复杂。接口增加一个方法,所有的代理类和委托类(实现类)都需要实现此方法,而且代理类和委托类(实现类)的关系为一对一,无法一对多。

  2)、动态代理。

        在程序运行时,通过反射机制动态生成代理类。事先不知道要代理的实现类是什么。

        优点:(1)能代理该接口的所有实现类。

                   (2)接口中的所有方法都在InvocationHandler.invoke方法中统一处理,不像静态代理那样每个都进行处理。        缺点:Java动态代理只能代理接口,要代理类需要使用如cglib第三方的类库。

 

2、代码。Proxy.java、DynamicProxy.java、UserServiceImpl.java、IUserService.java、User.java

package com.zxj.test.proxy;

import com.zxj.dao.entity.User;
import com.zxj.dao.service.IUserService;
import com.zxj.dao.service.impl.UserServiceImpl;

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

public class Proxy {
    private static void dynamicProxy() {
        User user = new User();
        user.setAge(11);
        user.setName("zhuoxiaojie");
        final UserServiceImpl userService = new UserServiceImpl();

        //在代码中直接实现,会造成代码重复。
        System.out.println("在代码中直接实现: ");
        IUserService server = (IUserService) java.lang.reflect.Proxy.newProxyInstance(
                userService.getClass().getClassLoader(),
                userService.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object result = null;
                        System.out.println("before to do someThing");
                        if (method.getName().equals("printInfo")) {
                            result = method.invoke(userService, args);
                        }
                        System.out.println("after to do someThing");
                        return result;
                    }
                });
        server.printInfo(user);

        //封装成类
        System.out.println("封装成类: ");
        DynamicProxy dynamicProxy=new DynamicProxy();
        IUserService server2= (IUserService) dynamicProxy.bind(userService);
        server2.printInfo(user);
    }

    public static void main(String[] args) {
        dynamicProxy();
    }
}
package com.zxj.test.proxy;

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

public class DynamicProxy implements InvocationHandler {
    //委托类
    private Object delegateObject;

    public Object bind(Object delegateObject) {
        this.delegateObject = delegateObject;
        return Proxy.newProxyInstance(
                delegateObject.getClass().getClassLoader(),
                delegateObject.getClass().getInterfaces(),
                this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        System.out.println("before to do someThing");
        if (method.getName().equals("printInfo")) {
            result = method.invoke(delegateObject, args);
        }
        System.out.println("after to do someThing");
        return result;
    }
}
package com.zxj.dao.service.impl;

import com.zxj.dao.entity.User;
import com.zxj.dao.service.IUserService;

public class UserServiceImpl implements IUserService {
    @Override
    public void printInfo(User user) {
        System.out.println(String.format("%s已经%d岁了", user.getName(), user.getAge()));
    }
}
package com.zxj.dao.service;

import com.zxj.dao.entity.User;

public interface IUserService {
    void printInfo(User user);
}
package com.zxj.dao.entity;

public class User {
    private String name;
    private int age;

    public User(){

    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3、结果。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)