- public interface HelloWorld {
- void sayHelloWorld();
- }
public interface HelloWorld {
void sayHelloWorld();
}
业务接口实现:
- public class HelloWorldImpl implements HelloWorld {
- public void sayHelloWorld() {
- System.out.println("Hello World!");
- }
- }
public class HelloWorldImpl implements HelloWorld {
public void sayHelloWorld() {
System.out.println("Hello World!");
}
}
InvocationHandler实现,需要在接口方法调用前后加入一部份处理工作,这里仅仅在方法调用前后向后台输出两句字符串,其代码如下:
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public class HelloWorldHandler implements InvocationHandler {
- //要代理的原始对象
- private Object objOriginal;
- /**
- * 构造函数。
- * @param obj 要代理的原始对象。
- */
- public HelloWorldHandler(Object obj) {
- this.objOriginal = obj ;
- }
- /**
- * 当调用原始对象的方法时,代理执行的方法
- * @param proxy 代理对象
- * @param method 要执行的原始对象方法
- * @param args 原始对象方法的参数值组
- * @return 原始对象方法执行的返回值
- */
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- Object result ;
- //方法调用之前
- doBefore();
- //调用原始对象的方法
- result = method.invoke(this.objOriginal ,args);
- //方法调用之后
- doAfter();
- return result ;
- }
- /**
- * 方法调用之前执行的方法
- */
- private void doBefore() {
- System.out.println("before method invoke!");
- }
- /**
- * 方法调用之后执行的方法
- */
- private void doAfter() {
- System.out.println("after method invoke!");
- }
- }
- 测试代码:
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Proxy;
- public class Test {
- public static void main(String[] args) {
- HelloWorld hw = new HelloWorldImpl();
- InvocationHandler handler = new HelloWorldHandler(hw);
- HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(
- hw.getClass().getClassLoader(),
- hw.getClass().getInterfaces(),
- handler);
- proxy.sayHelloWorld();
- }
- }
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class HelloWorldHandler implements InvocationHandler {
//要代理的原始对象
private Object objOriginal;
/**
* 构造函数。
* @param obj 要代理的原始对象。
*/
public HelloWorldHandler(Object obj) {
this.objOriginal = obj ;
}
/**
* 当调用原始对象的方法时,代理执行的方法
* @param proxy 代理对象
* @param method 要执行的原始对象方法
* @param args 原始对象方法的参数值组
* @return 原始对象方法执行的返回值
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result ;
//方法调用之前
doBefore();
//调用原始对象的方法
result = method.invoke(this.objOriginal ,args);
//方法调用之后
doAfter();
return result ;
}
/**
* 方法调用之前执行的方法
*/
private void doBefore() {
System.out.println("before method invoke!");
}
/**
* 方法调用之后执行的方法
*/
private void doAfter() {
System.out.println("after method invoke!");
}
}
测试代码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
HelloWorld hw = new HelloWorldImpl();
InvocationHandler handler = new HelloWorldHandler(hw);
HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(
hw.getClass().getClassLoader(),
hw.getClass().getInterfaces(),
handler);
proxy.sayHelloWorld();
}
}
1.首先获取一个业务接口的实现对象;
2.获取一个InvocationHandler实现,此处是HelloWorldHandler对象;
3.创建动态代理对象;
4.通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl. sayHelloWorld()方法前后输出两句字符串。
运行测试类输出如下:
before method invoke!
Hello World!
after method invoke!
此处Test类中的方法调用代码比较多,在我们的实际应用中可以通过配置文件来来简化客户端的调用实现。另外也可以通过动态代理来实现简单的AOP。