黑马程序员_动态代理

---------------------- <a href="http://www.itheima.com" target="blank">ASP.Net+Unity开发</a><a href="http://www.itheima.com" target="blank">.Net培训</a>、期待与您交流! ----------------------


定义一个接口A,A中有一个方法m1,定义一个类B,B实现A接口。要求通过jdk自带api创建B对象的代理类,并调用m1方法。


学习之前还是要先明确几点问题:什么是动态代理?怎样用动态代理?为什么要用动态代理?

一、什么是动态代理?

动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。是在程序运行时,运用反射机制动态创建而成。JDK动态代理中包含一个类和一个接口:

InvocationHandler接口: 

public interface InvocationHandler {

public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 

参数说明: Object proxy:指被代理的对象。 

Method method:要调用的方法 Object[] 

args:方法调用时所需要的参数

可以将InvocationHandler接口的子类想象成一个代理的最终操作类,替换掉ProxySubject。

Proxy类: 

Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法: 

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)  throws IllegalArgumentException 

参数说明: 

ClassLoader loader:类加载器 

Class<?>[] interfaces:得到全部的接口 

二、怎样使用动态代理

我们且看阳哥给的题目:

首先定义一个接口A:

  1. package interFace;  
  2.   
  3. public interface A {  
  4.     void m1(String s);  
  5. }  
再定义一个实现A的类B:

  1. package set;  
  2.   
  3. import interFace.A;  
  4.   
  5. public class B implements A{  
  6.   
  7.     @Override  
  8.     public void m1(String s) {  
  9.         // TODO Auto-generated method stub  
  10.         System.out.println(s);  
  11.     }  
  12.   
  13. }  

下面我们定义的是动态代理类,该类实现了Java反射包中的InvocationHandler接口。代理实例调用方法时,将对方法调用指派到它的代理处理器程序的invoke方法中。invoke方法内部实现预处理,对委托类方法调用,事后处理等逻辑

  1. package set;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5.   
  6. public class DynaHandler implements InvocationHandler {  
  7.     //要代理的原始对象  
  8.     private Object obj;  
  9.   
  10.     public DynaHandler(Object obj) {  
  11.         super();  
  12.         // TODO Auto-generated constructor stub  
  13.         this.obj = obj;  
  14.     }  
  15.   
  16.       
  17.     public Object invoke(Object proxy, Method method, Object[] args)  
  18.             throws Throwable {  
  19.         // TODO Auto-generated method stub  
  20.         Object result = null;  
  21.         //调用之前  
  22.         doBefore();  
  23.         result = method.invoke(obj, args);  
  24.         //调用之后  
  25.         doAfter();  
  26.         return null;  
  27.     }  
  28.   
  29.   
  30.     private void doAfter() {  
  31.         // TODO Auto-generated method stub  
  32.         System.out.println("调用invoke方法之后。。");  
  33.     }  
  34.   
  35.   
  36.     private void doBefore() {  
  37.         // TODO Auto-generated method stub  
  38.         System.out.println("调用invoke方法之前。。");  
  39.     }  
  40.   
  41. }  

最后我们进行测试:

  1. package test;  
  2.   
  3. import interFace.A;  
  4.   
  5. import java.lang.reflect.Proxy;  
  6.   
  7. import set.B;  
  8. import set.DynaHandler;  
  9.   
  10. public class DynamicTest {  
  11.     public static void main(String args[]) {  
  12.         B b = new B();  
  13.         DynaHandler handler = new DynaHandler(b);//代理实例的调用处理程序  
  14.         //创建一个实现业务接口的代理类,用于访问业务类。    
  15.         //返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序,如ProxyHandler。    
  16.         A a = (A) Proxy.newProxyInstance(b.getClass().getClassLoader(), b  
  17.                 .getClass().getInterfaces(), handler);  
  18.         a.m1("Hello HeiMa!");  
  19.     }  
  20. }  

三、使用动态代理有什么好处?


动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。

使用Java动态代理机制的好处:

1、减少编程的工作量。

2、系统扩展性和维护性增强,方便程序修改。

 
---------------------- <a href="http://www.itheima.com" target="blank">ASP.Net+Unity开发</a><a href="http://www.itheima.com" target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>

1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
### JavaEE 黑马程序员 学习资料 教程 下载 JavaEE 是企业级应用开发的重要技术栈,而黑马程序员提供了丰富的学习资源和教程,帮助开发者掌握 JavaEE 的核心技术和框架。以下是关于 JavaEE 黑马程序员学习资料的相关信息: #### 1. 黑马程序员官方课程资源 黑马程序员的 JavaEE 课程通常包括以下内容: - **基础部分**:涵盖 Java 基础、面向对象编程、集合框架等内容[^1]。 - **核心框架**:Spring 框架的学习,包括 Spring AOP、Spring MVC 等模块[^2]。 - **Web 开发**:涉及 Servlet、JSP、Filter 等 Web 技术[^3]。 - **数据库操作**:MyBatis、Hibernate 等 ORM 框架的使用。 - **分布式与微服务**:Dubbo、Spring Cloud 等微服务框架的学习。 这些课程资源通常可以通过黑马程序员的官方网站或其合作平台(如 Bilibili、优快云)获取。 #### 2. JDK 动态代理与 Spring AOP 在 JavaEE 开发中,Spring AOP 是一个重要的知识点。它默认使用 JDK 动态代理来实现代理功能。通过 `java.lang.reflect.Proxy` 类,可以调用 `newProxyInstance()` 方法创建代理对象[^2]。这种代理机制的优点在于可以在不修改原始代码的情况下增强某些方法的功能,实现无侵入式的代码扩展。 #### 3. SpringMVC 请求映射 SpringMVC 是 JavaEE 开发中的一个重要框架,用于处理 HTTP 请求和响应。通过 `@Controller` 和 `@RequestMapping` 注解,可以定义请求的映射路径[^3]。例如,以下代码展示了如何设置请求映射路径: ```java @Controller @RequestMapping("/user") // 类请求映射的路径 public class UserController { @RequestMapping("/commonParam") // 方法请求映射的路径 @ResponseBody public String commonParam(String name, int age) { System.out.println("name参数传递:" + name); System.out.println("age参数传递:" + age); return "success"; } } ``` #### 4. 学习资源下载 如果需要下载 JavaEE 相关的黑马程序员学习资料,可以尝试以下途径: - **官方网站**:访问黑马程序员官网,注册账号后可以下载相关课程资料。 - **第三方平台**:如 Bilibili、优快云、GitHub 等,搜索关键词“黑马程序员 JavaEE”可能找到免费或付费的课程资源。 - **论坛与社区**:加入 Java 开发者论坛或 QQ 群,与其他开发者交流并获取学习资料。 #### 5. 注意事项 在下载和使用学习资料时,请确保遵守版权法规。如果选择购买正版课程,可以获得更系统的学习体验和技术支持。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值