动态代理和静态代理各自的特点

Animal接口类

package cn.itheima.dynamic_static;


public interface Animal {


void eat();
void sleep();

}


Person接口类

package cn.itheima.dynamic_static;


public interface Person {
void think();
void speek();


}

Animal的实现类dog

package cn.itheima.dynamic_static;


public class Dog implements Animal {


@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("狗在吃");
}


@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("狗在睡");

}





}



Person的实现类Student

package cn.itheima.dynamic_static;


public class Student implements Person {


@Override
public void think() {
// TODO Auto-generated method stub
System.out.println("学生在思考");
}


@Override
public void speek() {
// TODO Auto-generated method stub
System.out.println("学生在讲话");
}


}

静态代理学生类

package cn.itheima.dynamic_static;


public class StaticStudent implements Person {
Student student = new Student();


@Override
public void think() {
// TODO Auto-generated method stub
System.out.println("人在认真");
student.think();
}


@Override
public void speek() {
// TODO Auto-generated method stub
System.out.println("人在认真");
student.speek();

}


}

静态代理增强dog类

package cn.itheima.dynamic_static;


public class StaticDog implements Animal,Person {


Dog dog = new Dog();
Student student = new Student();
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("狗在努力");
dog.eat();
}


@Override
public void sleep() {
// TODO Auto-generated method stub

System.out.println("狗在继续努力");
dog.sleep();
}





@Override
public void think() {
// TODO Auto-generated method stub
System.out.println("人在认真");
student.think();
}


@Override
public void speek() {
// TODO Auto-generated method stub
System.out.println("人在认真");
student.speek();
}



}


动态代理dog类

package cn.itheima.dynamic_static;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class DynamicDog implements InvocationHandler {


Dog dog = new Dog();
public Animal getProxy() {
Animal dogProxy = (Animal) Proxy.newProxyInstance(dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), this);
return dogProxy;

}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("狗在努力");
method.invoke(dog, null);
return null;
}



}

demo测试类

package cn.itheima.dynamic_static;


public class Demo {
public static void main(String[] args) {

StaticDog staticdog = new StaticDog();
Dog dog = new Dog();
dog.eat();
dog.sleep();
System.out.println("静态代理之后-------------------");
staticdog.eat();
staticdog.sleep();
System.out.println("学生的静态代理,多个代理类-------------");
StaticStudent ss = new StaticStudent();
ss.think();
ss.speek();
System.out.println("学生的静态代理,使用同一个代理类-------------");
staticdog.speek();
staticdog.think();
System.out.println("测试动态代理狗===============");
DynamicDog dogProxy = new DynamicDog();
Animal proxy = dogProxy.getProxy();
proxy.eat();
proxy.sleep();
}

}



结论:要对多个类进行增强,动态代理必须再创建一个新的代理类,静态代理可以都在一个类中完成,

要对类中的方法进行个性化增强,静态代理可以做到,动态代理不能做到

静态代理效率高,代码冗余

动态代理少些代理,能用很少的代码对一个类的所有方法实现一样的增强效果,但是不能独立增强一个方法

静态代理,目标接口增加了方法,静态代理会受到影响

动态代理则不会




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值