JDK动态代理初探
用户接口:
public interface IUser {
void show();
void create();
void update();
}
用户实现类:
public class UserImpl implements IUser{
public UserImpl(){
}
@Override
public void show(){
System.out.println("执行 => 展示");
}
@Override
public void create() {
System.out.println("执行 => 创建");
}
@Override
public void update() {
System.out.println("执行 => 更新");
}
}
Proxy:
import java.lang.reflect.Method;
public class UserProxy implements IUser{
IUser user;
public UserProxy(){
}
public UserProxy(IUser user){
this.user = user;
}
@Override
public void show(){
user.show();
System.out.println("Proxy:调用 => show");
}
@Override
public void create() {
user.create();
System.out.println("Proxy:调用 => create");
}
@Override
public void update() {
user.update();
System.out.println("Proxy:调用 => update");
}
}
测试类:
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args){
IUser user = new UserImpl();
IUser userProxy = new UserProxy(user);
userProxy.show();
userProxy.update();
userProxy.create();
}
}
效果:
但是我们可以发现,上面的这种如果想对所有方法都进行代理,其实非常麻烦,每个函数方法都得写一遍
所以引出动态代理,可以自动找到对应的方法 不用重写了
ProxyTest:
InvocationHandler userinvocationHandler = new UserInvocationHandler(user);
IUser userActiveProxy = (IUser) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), userinvocationHandler);
userActiveProxy.create();
userinvocationHandler:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class UserInvocationHandler implements InvocationHandler {
IUser user;
public UserInvocationHandler(){
}
public UserInvocationHandler(IUser user){
this.user = user;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
method.invoke(user, args);
return null;
}
}
可以成功执行方法
但是没有 实现日志的效果 加一句话就ok了