java jdk 动态代理

  • 1 定义一个接口
package proxy;

/**
 * @Package Name : ${PACKAG_NAME}
 * @Author : [email protected]
 * @Creation Date : 2018年11月19日下午9:31
 * @Function : todo
 */
public interface Hello {

    String sayHello(String str);

}
  • 2 接口的实现
package proxy.impl;

import proxy.Hello;

/**
 * @Package Name : ${PACKAG_NAME}
 * @Author : [email protected]
 * @Creation Date : 2018年11月19日下午9:31
 * @Function : todo
 */
public class HelloImpl implements Hello {
    @Override
    public String sayHello(String str) {
        return "HelloImp: " + str;
    }

}
  • 3  实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。
package proxy.dynamic;

import proxy.Hello;

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

/**
 * @Package Name : ${PACKAG_NAME}
 * @Author : [email protected]
 * @Creation Date : 2018年11月19日下午9:46
 * @Function : todo
 *
 * // 1. 首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。
 */
public class LogInvocationHandler implements InvocationHandler {

    private Hello hello;
    public LogInvocationHandler(Hello hello) {
        this.hello = hello;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if("sayHello".equals(method.getName())) {
            System.out.println("You said: " + Arrays.toString(args));
            //logger.info("You said: " + Arrays.toString(args));
        }
        return method.invoke(hello, args);
    }

}
  • 4 用的地方进行调用使用
package proxy.dynamic;

import proxy.Hello;
import proxy.impl.HelloImpl;

import java.lang.reflect.Proxy;

/**
 * @Package Name : ${PACKAG_NAME}
 * @Author : [email protected]
 * @Creation Date : 2018年11月19日下午9:50
 * @Function : todo
 */
public class ProxyTest {

    public static void main(String[] args) {

        // 2. 然后在需要使用Hello的时候,通过JDK动态代理获取Hello的代理对象。
        Hello hello = (Hello)Proxy.newProxyInstance(
                Hello.class.getClassLoader(), // 1. 类加载器
                new Class<?>[] {Hello.class}, // 2. 代理需要实现的接口,可以有多个
                new LogInvocationHandler(new HelloImpl()));// 3. 方法调用的实际处理者
        System.out.println(hello.sayHello("I love you!"));
    }

}

猜你喜欢

转载自blog.csdn.net/u010325193/article/details/85474265