黑马程序员-动态代理

---------------------- android培训java培训 、期待与您交流! ----------------------

 

 

动态代理模式

代理是只在不改变源文件的情况下,在源文件的功能基础上,添加其他的功能。比如
添加日志、权限检查等等,而不对原来的纵向业务逻辑产生影响。当不需要这些新添加的
功能的时候,可以直接很简单去除这些功能。


代理的实现 
静态代理的实现可以通过继承 、实现同一接口(聚合)的方式来实现。但是继承实现
起来很不方便,当需要实现的代理功能多时,会使类越来臃肿。所以一般都使用实现接口的方式来
实现代理。这个时候新的问题又出现了,当我们需要对很多类进行代理的时候,程序又变得笨拙,
因此,我们需要对不同的类动态的产生代理对象。这就是动态代理。

动态代理可以对任意对象,任意接口的方法,实现任意的代理

动态代理的原理是根据传入的对象动态生成代码。

实现动态代理的步骤
1 被代理类需要实现一个接口
2 创建代理类实现InvocationHandler 并重写invoke方法。
3 调用方法自身的invoke, 这时可以在invoke方法前后加入需要的逻辑
4 在主函数中创建接口对象和InvocationHandler对象
5 调用Proxy.newProxyInstance()传入接口对象的类加载器、接口对象和InvocationHandler对象
6 调用需要被代理的烦方法

实例

//创建被代理类的接口对象
public interface Car {
 void run();
 void stop();
}
//被代理类实现接口
public class Tank implements Car {
 public void run() {

  System.out.println("run.........");
 }

 @Override
 public void stop() {
  System.out.println("stop..........");
 }
}
//创建代理类并实现InvocationHandler接口,重写invoke方法
public class LogHandler implements InvocationHandler{
 private Car tank;
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  System.out.println("before log");//加入需要的逻辑
  Object tank=method.invoke(this.tank,args);//调用自身的invoke方法
  
  addLog();//加入需要的逻辑
  return tank;//返回invoke方法返回的值
 }
 
 public LogHandler(Tank tank) {
  super();
  this.tank = tank;
 }

 public void addLog(){
  
  System.out.println("add log");
 }

 public LogHandler(Car tank) {
  super();
  this.tank = tank;
 }
 
 
}
//主函数
public class Test {
 public static void main(String[] args) {
  //创建接口对象
  Car c = new Tank();
  //创建被代理类对象   
  InvocationHandler h = new LogHandler(c);
  //调用 Proxy.newProxyInstance方法传入参数分别是: 被代理类的类加载器,被代理类实现的接口 ,代理类
  Car car =(Car) Proxy.newProxyInstance(c.getClass().getClassLoader(), c.getClass()
    .getInterfaces(), h);
  car.run();//调用被代理类中的方法
  
  
 }
}


 

 

 

---------------------- android培训java培训 、期待与您交流! ----------------------

详细请查看:http://edu.youkuaiyun.com/heima

### 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、付费专栏及课程。

余额充值