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. Nat. Biotech. | AI、药物重定位和同行评审
  2. php 表单变量,PHP学习笔记——访问表单变量
  3. CSS sprites
  4. Hive中数据的加载和导出
  5. Python实现进程同步和通信
  6. Nancy总结(三)Nancy资料介绍
  7. 【gRPC】 在.Net core中使用gRPC
  8. 实现option上下移动_用jQuery实现lt;selectgt;选项上下移动 - 不要哀求 学会争取 若是如此 终有所获 - ITeye博客...
  9. leetcode518. 零钱兑换 II
  10. html5的新标记,HTML5 新标记
  11. golang python rpc_golang rpc的两种调用方法
  12. Lecture_2_4 线性回归中的系数,衡量了什么?
  13. 局域网计算机维护工具,教你用“小浣熊局域网维护小工具”,从此解脱烦恼!...
  14. DevOps组织IO专业人员新角色分析与技能提升
  15. java spin lock_JAVA 各种锁机制
  16. 《Windows高级调试》译者线上聊天活动获奖网友名单
  17. gitlab: [remote rejected] pre-receive hook declined
  18. scratch ios html,scratch手机版
  19. 练习7-9 计算天数(15 分)
  20. Excel表格导入导出功能实现

热门文章

  1. 获取android的拍照和自定义多选相册
  2. 微信小程序 点击收藏
  3. LaTeX中三种列举的形式:itemize,enumerate,description
  4. STM32F4+VL530L0x激光测距cubemx实现
  5. 王者荣耀s19赛季服务器维护,王者荣耀S19赛季突然宣布更新,缺少以往大肆宣传的背后隐藏了什么...
  6. StringBuilder笔记
  7. 学习笔记--网络流24题(上)
  8. JVM中的STW(Stop The World)
  9. 报错InvalidHeader: Invalid return character or leading space in header: User-Agent
  10. android充电状态广播,教学--监测电池的电量与充电状态