(1)代理对象的接口
package com.csii.proxy;
public interface UserService {public void show() ;
}
(2)代理对象类
package com.csii.proxy;
public class UserServiceImpl implements UserService {
@Override
public void show() {
System.out.println("执行中······");
}
}
(3)新增功能的接口
package com.csii.proxy;
public interface LoggerService {
public void before();
public void after();
}
(4)新增功能实现类
package com.csii.proxy;
public class LoggerServiceImpl implements LoggerService {
@Override
public void before() {
System.out.println("开始执行······");
}
@Override
public void after() {
System.out.println("执行结束······");
}
}
(5)MyInvocationHandler类,实现了InvocationHandler接口。
package com.csii.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
private LoggerService logerService;
/**
* 构造方法传入需要代理的对象和需要新增功能的对象
*/
public MyInvocationHandler(Object target,LoggerService logerService){
this.logerService=logerService;
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(logerService!=null){
logerService.before();
}
method.invoke(target, args);//invoke方法中的对象要从外部引入,因为如果传进来使用的话调用invoke方法会陷入死循环。
if(logerService!=null){
logerService.after();
}
return null;
}
/**
* 获取代理对象
*/
public Object getProxyObj(){
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{UserService.class}, this);
}
}
(6)测试类
package com.csii.userservice;
import org.junit.Test;
import com.csii.proxy.LoggerService;
import com.csii.proxy.LoggerServiceImpl;
import com.csii.proxy.MyInvocationHandler;
import com.csii.proxy.UserService;
import com.csii.proxy.UserServiceImpl;
public class MyProxyTest {
@Test
public void testProxy() throws Exception {
UserService userService = new UserServiceImpl();
LoggerService loggerService = new LoggerServiceImpl();
MyInvocationHandler myInvocationHandler =new MyInvocationHandler(userService,loggerService);
UserService userProxy = (UserService)myInvocationHandler.getProxyObj();
userProxy.show();
}
}
(7)测试结果截图