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();
}

}

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

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

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

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

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

动态代理则不会

动态代理和静态代理各自的特点相关推荐

  1. 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  2. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  3. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)

    概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...

  4. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  5. Java设计模式之代理(动态代理,静态代理)

    代理设计模式,是一种常用的设计模式.顾名思义,在面向对象的世界中,就是一个对象对另一个对象的代理. 如现实生活中,处处都是代理,中介是对业主的代理,王婆是对金莲的代理,经纪人至于艺人的代理,销售代理等 ...

  6. 浅谈动态代理和静态代理的底层原理及实现

    什么是反射,反射的作用是什么 ​ Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用 ...

  7. 代理的理解(动态代理与静态代理)

    静态代理与动态代理(JDK.CGLIB) 问题引入 什么是代理 什么是静态代理? 什么是动态代理? 静态代理和动态代理的区别是什么? JDK动态代理和CGLIB动态代理的区别? 代理 代理就是帮人做事 ...

  8. 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库

    文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...

  9. java 动态代理与静态代理

    代理在生活中比较常见,比如常见的代理商,对工厂进行代理,工厂专注生产,代理商负责经销,用户购买商品从代理商手中购买.java中代理分为动态代理与静态代理,其中动态代理比较常见的有jdk动态代理和cgl ...

最新文章

  1. chrome浏览器不能录音:Uncaught TypeError: Cannot read property ‘getUserMedia‘ of undefined解决方法
  2. win7系统自带截图工具快捷键是什么?怎么设置快捷键
  3. 信号量、互斥体和自旋锁
  4. selenium抓取_使用Selenium的网络抓取电子商务网站
  5. 【转】RabbitMQ六种队列模式-1.简单队列模式
  6. 嵌入式里如何给内存做压力测试?不妨试试memtester
  7. 最近刚写的——三维饼图
  8. Python内置函数iter()语法及应用
  9. poj1942——组合数学
  10. Sprite Editor 图集切片精灵
  11. Open Robotics 十周年(2012-2022)
  12. 你还不知道高情商表现怎么表现?
  13. python关系图谱_文本分析之制作网络关系图 Python
  14. 哪个平台回收速度快?
  15. 字节跳动自研万亿级图数据库 图计算实践
  16. 最佳机器学习公共数据集
  17. python跨年表白神器--你值得拥有!
  18. 未来的两马之争,马化腾如何才能打赢马云?
  19. 关闭编译器FPO优化
  20. 沉静型人格分析,沉静型性格的职业发展

热门文章

  1. 小米cc9计算机在哪方面的应用,小米CC9e深度使用10天之后,说说最真实的感受
  2. 更好的设计 | 苹果cms10《 SKRN》自适应影视站绿色清新精品模板高端大气宽屏轮播
  3. 为什么35岁以后的中年人,会对自己的未来无比焦虑?
  4. IDEA使用code with me来进行多人远程编程
  5. 长春理工大学计算机考研专业课139,数二98,英二52,。上岸经验分享
  6. 我用Python做了一个咖啡馆数据分析
  7. torch-geometric安装教程及常见源下载报错问题
  8. ajax 同步和异步区别?
  9. IDEA中快捷键大全
  10. web前端——html介绍和head标签