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);
}
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);
}
}
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!"));
}
}