Java动态代理
静态代理
例如又一个房东 可以收房租 有一个代理是中介 可以直接交房租给房东 也可以交房租给中介 但是在交给中介前或者交给中介后可以进行其他操作 定义一个IUser接口 Iuser.java
public interface IUser {
void show();
}
Iuser的实现类 UserImpl.java
public class UserImpl implements IUser{
public UserImpl(){
}
@Override
public void show() {
System.out.println("展示");
}
}
创建一个代理类
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("调用了show");
}
}
然后通过调用代理类去调用user的show方法
public class ProxyTest {
public static void main(String[] args){
IUser user = new UserImpl();
IUser userProxy = new UserProxy(user);
userProxy.show();
}
}
运行
动态代理
如果使用静态代理 那么假如IUser中有很多方法 对应的代理类里边也要相应的写上对应的方法 无疑增加了代码量 动态代理实现了 通过反射去调用代理类的方法 创建一个UserInvocationHandler.java类 继承InvocationHandler接口
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);
System.out.println("调用了"+method.getName());
return null;
}
}
测试
public class ProxyTest {
public static void main(String[] args){
IUser user = new UserImpl();
//动态代理
UserInvocationHandler userInvocationHandler = new UserInvocationHandler(user);
IUser userProxy = (IUser)
//代理对象的每个执行方法都会替换执行Invocation中的invoke方法
Proxy.newProxyInstance(user.getClass().getClassLoader(),user.getClass().getInterfaces(),userInvocationHandler);
userProxy.show();
}
}
Java动态代理
http://example.com/2021/09/12/OldBlog/java动态代理/