1、静态代理
1、代理对象的一个接口只用于一种类型的对象,如果要代理的方法很多,静态代理在程序规模稍大时就无法胜任
2、如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
interface Sale{
public void sell();
}
class Owner implements Sale{
@Override
public void sell() {
System.out.println("房东销售房。。。。。。");
}
}
class Agent implements Sale{
private Owner owner=new Owner();
@Override
public void sell() {
System.out.println("中介介绍");
owner.sell();
System.out.println("中介收费");
}
public class Test {
public static void main(String[] args) {
Agent agent =new Agent();
agent.sell();
}
}
2、动态代理
1.动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。
2.动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。
//实现InvocationHandler接口
class MyInvocationHandler implements InvocationHandler{
//目标对象
private Object target;
public MyInvocationHandler(Object target){
super();
this.target=target;
}
//代理实例、方法、参数
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before。。。。。。");
Object result=method.invoke(target, args);
System.out.println("after。。。。。。");
return result;
}
public Object getProxy(){
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);
}
}
interface Service{
public void add();
}
class ServiceImpl implements Service{
@Override
public void add() {
System.out.println("add target。。。。。。");
}
}
public class Test {
public static void main(String[] args) {
Service user=new ServiceImpl();
MyInvocationHandler myInvocationHandler=new MyInvocationHandler(user);
//从代理中获取对象
Service proxy=(Service) myInvocationHandler.getProxy();
proxy.add();
}
}