UserService接口
public interface UserService {
public void add();
public void del();
public void update();
public void query();
}
UserServiceImpl类实现UserService接口
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("add");
}
@Override
public void del() {
System.out.println("del");
}
@Override
public void update() {
System.out.println("update");
}
@Override
public void query() {
System.out.println("query");
}
}
调用处理程序,使用它的getProxy()方法可以动态代理target
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//得到代理类
public Object getProxy() {
Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return proxy;
}
//处理代理类实例,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = method.invoke(target, args);
return res;
}
}
测试类Client:动态生成UserService接口的代理类
import com.mqb.UserService;
import com.mqb.UserServiceImpl;
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
ProxyInvocationHandler invo = new ProxyInvocationHandler();
invo.setTarget(userService);
UserService proxy = (UserService) invo.getProxy();
proxy.add();
proxy.del();
proxy.update();
proxy.query();
}
}
运行测试程序
add
del
update
query
当调用方法时,自动输出方法名 需要在调用处理程序中添加方法,之后再invoke()方法中去调用即可
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy() {
Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在这里添加新添加的log()方法
log(method.getName());
Object res = method.invoke(target, args);
return res;
}
//新添加的方法
public void log(String method){
System.out.println("调用了"+method+"方法");
}
}
接着再运行测试类,输出如下结果
调用了add方法
add
调用了del方法
del
调用了update方法
update
调用了query方法
query