总体设计

包com.xzit.aop


  • Dynlnvoke
  • ProducerProxy

包com.xzit.db


  • db

包com.xzit.entity


  • Client
  • Department
  • Employee
  • Goods
  • Producer

包com.xzit.interfaces


  • DepartmentDaoImp
  • EmployeeDaoImp
  • IGoods
  • IObject

包com.xzit.proxy


  • TeatDynProxy
  • TestStaticProxy

咱直接上代码,附一张图,如果看到这里,我希望你看完,我是歌谣,期待一起共同进步

工具:IDEA

package:aop

Dynlnvoke类

package com.xzit.aop;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class DynInvoke implements InvocationHandler {private Object target; // 被代理的对象/*** 重写实现动态代理的invoke方法*/public Object invoke(Object arg0, Method arg1, Object[] arg2)throws Throwable {System.out.println("动态代理方法");Object obj = arg1.invoke(target, arg2);return obj;}public void setTarget(Object target) {this.target = target;}}

ProducerProxy类

package com.xzit.aop;import java.util.List;import com.xzit.entity.Client;
import com.xzit.entity.Goods;
import com.xzit.entity.Producer;
import com.xzit.interfaces.IGoods;public class ProducerProxy implements IGoods {private Producer producer; // 被代理对象private Client client;// 购买对象public List<Goods> produerGoodsList() {boolean bool = validateIsVip();if(bool){List<Goods> goodsList = producer.produerGoodsList();for(Goods g:goodsList){g.setPrice(g.getPrice()*0.85);}return goodsList;}return producer.produerGoodsList();}public void setProducer(Producer producer) {this.producer = producer;}public void setClient(Client client) {this.client = client;}private boolean validateIsVip(){if(client.isVip())return true;return false;} }

package:db

db类

package com.xzit.db;import java.util.ArrayList;
import java.util.List;import com.xzit.entity.Department;
import com.xzit.entity.Employee;
import com.xzit.entity.Goods;public class DataBase {public static final List<Department> DEPLIST = new ArrayList<Department>();public static final List<Employee> EMPLIST = new ArrayList<Employee>();public static final List<Goods> GOODSLIST = new ArrayList<Goods>();static{DEPLIST.add(new Department("dep100","事业部"));DEPLIST.add(new Department("dep200","策划部"));DEPLIST.add(new Department("dep300","市场部"));DEPLIST.add(new Department("dep400","人事部"));DEPLIST.add(new Department("dep500","研发部"));DEPLIST.add(new Department("dep600","测试部"));EMPLIST.add(new Employee("任我行","男","黑木崖"));EMPLIST.add(new Employee("任盈盈","女","黑木崖"));EMPLIST.add(new Employee("令狐冲","男","华山"));EMPLIST.add(new Employee("岳不群","男","华山"));EMPLIST.add(new Employee("丁春秋","男","南海"));GOODSLIST.add(new Goods("goods100","加热器",123.50));GOODSLIST.add(new Goods("goods200","胜利羽毛球lark4",54.00));GOODSLIST.add(new Goods("goods300","联想笔记本T450",8900.50));GOODSLIST.add(new Goods("goods400","小米麦克风",99.50));}
}

package:entity

Client类

package com.xzit.entity;/*** 客户实体类* @author Administrator**/
public class Client {private String name; // 客户姓名private boolean isVip; // 是否是VIP客户public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isVip() {return isVip;}public void setVip(boolean isVip) {this.isVip = isVip;}
}

Department类

package com.xzit.entity;
/*** 部门信息实体类* @author Administrator**/
public class Department {private String number;// 部门编号private String name;// 部门名称public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Department() {}public Department(String number, String name) {this.number = number;this.name = name;}
}

Emploee类

package com.xzit.entity;
/*** 员工实体类* @author Administrator**/
public class Employee {private String name;private String sex;private String address;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}/*** 无参构造器*/public Employee() {}/*** 有参构造器* @param name* @param sex* @param address*/public Employee(String name, String sex, String address) {this.name = name;this.sex = sex;this.address = address;}
}

Goods类

package com.xzit.entity;
/*** 商品实体类* @author Administrator**/
public class Goods {private String number;// 商品编号private String name;// 商品名称private Double price; // 商品单价public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public Goods() {}public Goods(String number, String name, Double price) {this.number = number;this.name = name;this.price = price;}
}

Producer类

package com.xzit.entity;import java.util.List;import com.xzit.db.db.DataBase;
import com.xzit.interfaces.IGoods;
/*** 生产商* @author Administrator**/
public class Producer implements IGoods {public List<Goods> produerGoodsList() {return DataBase.GOODSLIST;}}

package:interfaces

DepartmentDaoImp类

package com.xzit.interfaces;import java.util.List;import com.xzit.db.db.DataBase;public class DepartmentDaoImp<T> implements IObject<T> {public List<T> findList() {System.out.println("获取部门列表");return (List<T>) DataBase.DEPLIST;}}

EmployeeDaoImp类

package com.xzit.interfaces;import java.util.List;import com.xzit.db.db.DataBase;public class EmployeeDaoImp<T> implements IObject<T> {public List<T> findList() {System.out.println("获取员工列表");return (List<T>) DataBase.EMPLIST;}}

IGoods

package com.xzit.interfaces;import java.util.List;import com.xzit.entity.Goods;/*** 提供产品列表的接口* 代理实现者和被代理对象都应该实现此接口* @author Administrator**/
public interface IGoods {/*** 提供产品的方法* @return*/List<Goods> produerGoodsList();
}

IObject

package com.xzit.interfaces;import java.util.List;public interface IObject<T> {/*** 查找目标数据列表* @return*/List<T> findList();
}

package:proxy

TeatDynProxy

package com.xzit.proxy;import java.lang.reflect.Proxy;
import java.util.List;import com.xzit.aop.DynInvoke;
import com.xzit.entity.Department;
import com.xzit.entity.Employee;
import com.xzit.interfaces.DepartmentDaoImp;
import com.xzit.interfaces.EmployeeDaoImp;
import com.xzit.interfaces.IObject;public class TestDynProxy {/*** 动态代理测试* @param args*/public static void main(String[] args) {DynInvoke dynInovke = new DynInvoke();// 创建动态代理对象DepartmentDaoImp<Department> depDao = new DepartmentDaoImp<Department>();// 创建被代理的目标对象EmployeeDaoImp<Employee> empDao = new EmployeeDaoImp<Employee>();//dynInovke.setTarget(depDao);// 设置被代理对象dynInovke.setTarget(empDao);// 设置被代理对象Class [] classes = depDao.getClass().getInterfaces();// 获取所有被代理对象的父接口数组IObject iObject = (IObject)Proxy.newProxyInstance(empDao.getClass().getClassLoader(), classes,dynInovke);// 获取代理类实例List<Employee> depList = iObject.findList();// 调用目标方法for(Employee dep:depList){System.out.println(dep.getName());}}}

TestStaticProxy

package com.xzit.proxy;import java.util.List;
import java.util.Scanner;import com.xzit.aop.ProducerProxy;
import com.xzit.entity.Client;
import com.xzit.entity.Goods;
import com.xzit.entity.Producer;public class TestStaticProxy {public static void main(String[] args) {Scanner in = new Scanner(System.in);ProducerProxy proxy = new ProducerProxy();// 代理实现者proxy.setProducer(new Producer());System.out.println("输入客户姓名");String name = in.next();System.out.println("您是VIP请输入1,否则输入 0");int isVip = in.nextInt();boolean bool = isVip == 1?true:false;Client c = new Client();c.setName(name);c.setVip(bool);proxy.setClient(c);List<Goods> goodsList = proxy.produerGoodsList();// 调用代理实现方法for(Goods g:goodsList){System.out.println(g.getName()+"\t"+g.getNumber()+"\t"+g.getPrice());}}}

运行结果

动态代理方法

动态代理方法
获取员工列表
任我行
任盈盈
令狐冲
岳不群
丁春秋

静态代理方法

输入客户姓名
歌谣
您是VIP请输入1,否则输入 0
1
加热器 goods100    104.975
胜利羽毛球lark4  goods200    45.9
联想笔记本T450   goods300    7565.425
小米麦克风   goods400    84.575

本人来博客已经两月有余,期待与大家共同进步。分享技术,分享快乐。我是歌谣,感谢关注。

如果你看到这篇文章,请留下你的鼓励,谢谢。

java学习(178):终篇?静态代理?动态代理?相关推荐

  1. java学习与总结:反射及动态代理

    文章目录 反射.反射流程.应用场景 静态代理||动态代理 类加载子系统 类加载机制 全盘负责 缓存机制 双亲委派机制 打破双亲委派机制---tomcat容器 反射.反射流程.应用场景 获取Class的 ...

  2. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  3. Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了

    动态代理与静态代理 前言 代理模式 静态代理 动态代理 JDK代理 动态生成代理对象原理 生成class数据源码 动态代理类真身 总结 前言 近期在研究Hook技术,需要用到动态代理,说到动态代理就会 ...

  4. java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)

    java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理     基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...

  5. 面试被问到Java 静态代理/动态代理?不用怕,这样子就可以!!

    理解Java动态代理需要对Java的反射机制有一定了解 什么是代理模式# 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象. 例如,购买火 ...

  6. 【Java】代理模式(静态代理动态代理)

    CONTENT 代理模式 静态代理 动态代理 JDK 动态代理(基于接口) CGLIB 动态代理(基于类继承) JDK 动态代理 v.s. CGLIB 动态代理 JDK 动态代理为什么必须基于接口 R ...

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

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

  8. CCNA-第六篇-静态路由+动态路由开头

    ** CCNA-第六篇-静态路由+动态路由 ** 一,路由概念 什么是路由? 路由呢,应该说是除了IP以外在网络世界中最重要的东西了 万物互联,互联网,都是基于路由的,前期的啥静态动态,后期的MPLS ...

  9. ❤️Spring的静态、动态代理模式

    ❤️Spring的静态/动态代理模式 为什么要学习代理模式,因为AOP的底层机制就是动态代理! 代理模式: 静态代理 动态代理 1.静态代理 静态代理角色分析 抽象角色 : 一般使用接口或者抽象类来实 ...

  10. 静态代理,动态代理,Cglib代理详解

    一.静态代理 新建一个接口 定义一个玩家方法: package com."".proxy.staticc;public interface Iplayer { public voi ...

最新文章

  1. 3.Chrome数据同步服务分析--server一片
  2. 使用get set方法添减属性_头皮银屑病“克星”使用方法,你GET了吗?
  3. 网络编程套接字API
  4. mac 查看指定端口情况 并杀死该进程
  5. 「钓鱼攻击」免杀钓鱼上线捆绑利器
  6. CVPR 2019 | 今日新出14篇论文汇总(来自微软、商汤、腾讯、斯坦福等)
  7. java 反射 单例类_利用反射机制破坏单例模式
  8. java stream map
  9. Linux 命令(17)—— su 与 sudo 命令
  10. Process Explorer
  11. 基于jieba和哈工大信息检索研究中心同义词词林扩展版的同义词替换安装与测试
  12. u盘的大小在计算机无法显示,Win10电脑插入U盘后没有显示可用容量打不开无法读取如何解决...
  13. 贪吃蛇c语言程序 简书,贪吃蛇游戏(scratch编程)
  14. 计算机或可编程控制器,浅谈可编程控制器的应用
  15. python画图配色_python matplotlib包图像配色方案
  16. sch i699android4,SCH-I699
  17. 标准证件照电子版怎么做?
  18. C++在线编辑器:cpp.sh
  19. 爬取京东网站前后一星期的笔记本电脑信息并可视化
  20. 100首经典英文歌曲

热门文章

  1. jQuery布局插件UI Layout简介
  2. Spring 注解AOP 入门
  3. php判断中英文请求,并实现跳转
  4. 飞腾 linux 内核,FT2004-Xenomai
  5. mysql浅拷贝_深拷贝与浅拷贝
  6. ajax拼接显示不同样式,Ajax重点整理
  7. [Linux] VIM 代码折叠
  8. elemnt的Table 表格使用注意事项
  9. Nginx下配置小绿锁https
  10. [react-router] React-Router 4的switch有什么用?