黑马程序员—动态代理

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

动态代理类是一个实现在创建类时在运行时指定的接口列表的类,

 该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。

 代理实例 是代理类的一个实例。

 每个代理实例都有一个关联的调用处理程序 对象,

 它可以实现接口 InvocationHandler

 通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 Invoke 方法,

 并传递代理实例、识别调用方法的 java.lang.reflect.Method 对象以及包含参数的 Object 类型的数组。

 调用处理程序以适当的方式处理编码的方法调用,

 并且它返回的结果将作为代理实例上方法调用的结果返回

 

Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类

 

publicclass ProxyDemo1

{

    publicstaticvoid main(String[] args)

    {

       //创建一个collection类的动态代理类

       Class clazzproxy = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);

 

       //输出这个动态代理类的名字

       System.out.println(clazzproxy.getName().toString());

      

       //获得这个动态代理类的所有构造方法

       getInstances(clazzproxy);

      

       //分界,上面是构造方法下面是方法

       System.out.println("=============================================================");

      

       //获得这个动态代理类的所有方法

       getMethods(clazzproxy);

      

    }

下面是getInstance方法,获得动态代理类的所有构造方法

publicstaticvoid getInstances(Class clazzproxy)

    {

       //获得构造方法的数组

       Constructor[] constructors = clazzproxy.getConstructors();

      

       //遍历构造方法数组,并输出每个构造方法的参数类型

       for(Constructor c : constructors)

       {

           String name = c.getName();

          

           StringBuilder sb = new StringBuilder();

          

           sb.append(name+"(");

          

           //获得构造方法的参数类型的Class数组

           Class[] clazzparams = c.getParameterTypes();

          

           //遍历参数类型数组,并把参数一个一个的加入sb

           for(Class param : clazzparams)

           {

              sb.append(param.getName().toString()+",");

           }

          

           //如果参数数组为空,就把()中加入一个逗号,便于统一删除最后一个逗号

           if(clazzparams.length==0)

              sb.append(",");

          

           //删除最后一个参数后面的多余的逗号

           sb.deleteCharAt(sb.length()-1);

          

           sb.append(")");

          

           System.out.println(sb.toString());

       }

    }

getMethod获得动态代理类的所有方法

根据获得动态代理类的构造方法的原理获得动态代理类的所有方法

    publicstaticvoid getMethods(Class clazzproxy)

    {

       Method[] methods = clazzproxy.getMethods();

      

       for(Method m : methods)

       {

           String name = m.getName();

          

           StringBuilder sb = new StringBuilder();

          

           sb.append(name+"(");

          

           Class[] clazzparams = m.getParameterTypes();

          

           for(Class param : clazzparams)

           {

              sb.append(param.getName().toString()+",");

           }

          

           if(clazzparams.length==0)

              sb.append(",");

          

           sb.deleteCharAt(sb.length()-1);

          

           sb.append(")");

          

           System.out.println(sb.toString());

          

       }

    }

 

InvocationHandler 类:

   代理实例的调用处理程序 实现的接口。

   每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,

   将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法

  

总结创建动态类的实例对象的步骤:         

1、创建一个collection类的动态代理类

       例:Class clazzproxy = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);

2、利用反射获得动态代理类的构造方法,构造方法中参数类型为InvocationHandler

       Constructor constructor = clazzproxy.getConstructor(InvocationHandler.class);

3、利用反射创建实现动态代理的Collection

       Collection coll = (Collection) constructor.newInstance(new MyInvocationHandler());

 

 

简单方法创建动态类的实例对象

     Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class },handler);

 

 

publicclass ProxyDemo2

{

    publicstaticvoid main(String[] args) throws Exception

    {

       //创建一个collection类的动态代理类

       Class clazzproxy = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);

 

       //输出这个动态代理类的名字

       System.out.println(clazzproxy.getName().toString());

      

       //获得动态代理类的构造方法,利用反射

       Constructor constructor = clazzproxy.getConstructor(InvocationHandler.class);

 

       class MyInvocationHandler implements InvocationHandler

       {

 

           @Override

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

           {

             

              returnnull;

           }

          

       }

      

       //利用反射创建实现动态代理的Collection类,使用自己的MyInvocationHandler方法

       Collection proxy1 = (Collection) constructor.newInstance(new MyInvocationHandler());

      

       System.out.println(proxy1);

       //利用反射创建实现动态代理的Collection类,使用自带的InvocationHandler方法

       Collection proxy2 = (Collection) constructor.newInstance(new InvocationHandler() {

          

           @Override

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

                  throws Throwable {

              // TODO Auto-generated method stub

              returnnull;

           }

       });

       //利用反射创建实现动态代理的Collection类,直接用Proxy的构造方法

       Collection proxy3 = (Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),

              new Class[]{ Collection.class},

              new InvocationHandler()

              {

          

                  ArrayList arr = new ArrayList();

                 

                  @Override

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

                  {

                    

                     long begintime = System.currentTimeMillis();

                     Object value = method.invoke(arr, args);

                     long endtime = System.currentTimeMillis();

                     System.out.println(method.getName()+"运行时间:"+(endtime-begintime));

                     return value;

                  }

              }

       );

      

       proxy3.add("111");

      

       proxy3.add("222");

      

       proxy3.add("333");

      

       System.out.println(proxy3.size());

      

    }

 

}

 

 

 

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

标题基于SpringBoot+Vue的社区便民服务平台研究AI更换标题第1章引言介绍社区便民服务平台的研究背景、意义,以及基于SpringBoot+Vue技术的研究现状和创新点。1.1研究背景与意义分析社区便民服务的重要性,以及SpringBoot+Vue技术在平台建设中的优势。1.2国内外研究现状概述国内外在社区便民服务平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在SpringBoot+Vue技术应用上的创新之处。第2章相关理论介绍SpringBoot和Vue的相关理论基础,以及它们在社区便民服务平台中的应用。2.1SpringBoot技术概述解释SpringBoot的基本概念、特点及其在便民服务平台中的应用价值。2.2Vue技术概述阐述Vue的核心思想、技术特性及其在前端界面开发中的优势。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue如何有效整合,以提升社区便民服务平台的性能。第3章平台需求分析与设计分析社区便民服务平台的需求,并基于SpringBoot+Vue技术进行平台设计。3.1需求分析明确平台需满足的功能需求和性能需求。3.2架构设计设计平台的整体架构,包括前后端分离、模块化设计等思想。3.3数据库设计根据平台需求设计合理的数据库结构,包括数据表、字段等。第4章平台实现与关键技术详细阐述基于SpringBoot+Vue的社区便民服务平台的实现过程及关键技术。4.1后端服务实现使用SpringBoot实现后端服务,包括用户管理、服务管理等核心功能。4.2前端界面实现采用Vue技术实现前端界面,提供友好的用户交互体验。4.3前后端交互技术探讨前后端数据交互的方式,如RESTful API、WebSocket等。第5章平台测试与优化对实现的社区便民服务平台进行全面测试,并针对问题进行优化。5.1测试环境与工具介绍测试
### 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、付费专栏及课程。

余额充值