JDK动态代理demo

1.JDK动态代理

主要使用到 InvocationHandler 接口和 Proxy.newProxyInstance() 方法。 JDK动态代理要求被代理实现一个接口,只有接口中的方法才能够被代理 。其方法是将被代理对象注入到一个中间对象,而中间对象实现InvocationHandler接口,在实现该接口时,可以在 被代理对象调用它的方法时,在调用的前后插入一些代码。而 Proxy.newProxyInstance() 能够利用中间对象来生产代理对象。插入的代码就是切面代码。所以使用JDK动态代理可以实现AOP。

下面来看例子

interface

public interface UserService {

    void addUser();

    String findUserById();

}

impl

import com.spring.aop.jdk.service.UserService;

public class UserServiceImpl implements UserService {

    @Override

    public void addUser() {

        System.out.println("start insert user into database");

    }

    @Override

    public String findUserById() {

        System.out.println("start find user by userId");

        return null;

    }

}

代理中间类

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class ProxyUtil implements InvocationHandler {

    private Object target;//被代理的对象

    @Override

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("do something before");

        // 调用被代理对象的方法并得到返回值

        Object result = method.invoke(target, args);

        System.out.println("do something after");

        return result;

    }

    public ProxyUtil(Object target) {

        this.target = target;

    }

    public Object getTarget() {

        return target;

    }

    public void setTarget(Object target) {

        this.target = target;

    }

}

Test

import java.lang.reflect.Proxy;

import com.spring.aop.jdk.proxy.ProxyUtil;

import com.spring.aop.jdk.service.UserService;

import com.spring.aop.jdk.service.impl.UserServiceImpl;

public class Main {

    public static void main(String[] args) {

        Object proxyObject = new UserServiceImpl();

        ProxyUtil proxyUtil = new ProxyUtil(proxyObject);

        UserService userService  = (UserService) Proxy.newProxyInstance(

        Thread.currentThread().getContextClassLoader(),

        UserServiceImpl.class.getInterfaces(), proxyUtil);

        userService.addUser();

        userService.findUserById();

    }

}


输出结果

do something before

start insert user into database

do something after

do something before

start find user by userId

do something after

你可能感兴趣的:(JDK动态代理demo)