1、静态代理
在不改变目标对象的前提下,对目标功能进行扩展
静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.
接口
public interface IUser {
public void name();
}
目标
public class User implements IUser {
@Override
public void name() {
System.out.println("My name is lily");
}
}
代理
public class PUser implements IUser {
private User user;
public PUser(User user) {
super();
this.user = user;
}
@Override
public void name() {
user.name();
}
}
测试
public class Proxy1 {
public static void main(String[] args) {
User user = new User();
PUser pUser = new PUser(user);
pUser.name();
}
}
调用的是代理的方法
静态代理缺点:需要实现所有的接口,目标对象改变,代理需要跟着改变,代码维护比较困难
2、动态代理
代理不需要通过实现接口来完成,而是通过反射的方式来创建动态类
public class ProxyFactory {
private Object user;
public ProxyFactory(Object user) {
super();
this.user = user;
}
// 给目标对象生成代理对象
public Object getProxyInstance() {
return Proxy.newProxyInstance(user.getClass().getClassLoader(), user
.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object returnValue = method.invoke(user, args);
return returnValue;
}
});
}
}
测试 同静态代理一致
public class Proxy2 {
public static void main(String[] args) {
IUser user = new User();
IUser proxy = (IUser) new ProxyFactory(user).getProxyInstance();
proxy.name();
}
}
代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理