Java使用反射生成JDK代理示例

 更新时间:2019年07月15日 10:11:15   作者:cakincqm  
这篇文章主要介绍了Java使用反射生成JDK代理,结合实例形式分析了java基于反射实现jdk动态代理相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java使用反射生成JDK代理。分享给大家供大家参考,具体如下:

一 点睛

1 动态代理

java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类或动态代理对象。

Proxy 提供用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类。如果我们在程序中为一个或多个接口动态地生成实现类,就可以使用Proxy来创建的动态代理类;如果需要为一个或多个接口动态地创建实例,也可以使用Proxy来创建动态代理实例。

2 Proxy

Proxy提供了如下两个方法来创建动态代理类和动态代理实例:

static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces):创建一个动态代理类所对应的Class对象,该代理类将实现interfaces所指定的多个接口。第一个ClassLoader指定生成动态代理类的类加载器。

static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler  h):直接创建一个动态代理对象,该代理对象的实现类实现了interfaces指定的系列接口,执行代理对象的每个方法时都会被替换执行InvocationHandler对象的invoke方法。

二 实战

1 代码

import java.lang.reflect.*;
interface Person
{
  void walk();
  void sayHello(String name);
}
class MyInvokationHandler implements InvocationHandler
{
  /*
  执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法
  其中:
  proxy:代表动态代理对象
  method:代表正在执行的方法
  args:代表调用目标方法时传入的实参。
  */
  public Object invoke(Object proxy, Method method, Object[] args)
  {
    System.out.println("----正在执行的方法:" + method);
    if (args != null)
    {
      System.out.println("下面是执行该方法时传入的实参为:");
      for (Object val : args)
      {
        System.out.println(val);
      }
    }
    else
    {
      System.out.println("调用该方法没有实参!");
    }
    return null;
  }
}
public class ProxyTest
{
  public static void main(String[] args)
    throws Exception
  {
    // 创建一个InvocationHandler对象
    InvocationHandler handler = new MyInvokationHandler();
    // 使用指定的InvocationHandler来生成一个动态代理对象
    Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader()
      , new Class[]{Person.class}, handler);
    // 调用动态代理对象的walk()和sayHello()方法
    p.walk();
    p.sayHello("孙悟空");
  }
}

2 运行

E:\Java\疯狂java讲义\codes\18\18.5>java ProxyTest
----正在执行的方法:public abstract void Person.walk()
调用该方法没有实参!
----正在执行的方法:public abstract void Person.sayHello(java.lang.String)
下面是执行该方法时传入的实参为:
孙悟空

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java 栈和队列的交互实现

    Java 栈和队列的交互实现

    栈和队列都是常用的数据结构,本文就来介绍一下Java 栈和队列的交互实现,主要包括队列模拟实现栈及栈模拟实现队列,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Java中的HashSet集合存储数据的结构详解

    Java中的HashSet集合存储数据的结构详解

    这篇文章主要介绍了Java中的HashSet集合存储数据的结构详解,数组结构他把元素进行分组,相同哈希值的元素是一组,链表/红黑树结构把相同哈希值的元素链接到一起,存储数据到集合中,先计算元素的哈希值,需要的朋友可以参考下
    2023-09-09
  • Spring AOP日志框架实现过程图解

    Spring AOP日志框架实现过程图解

    这篇文章主要介绍了Spring AOP日志框架实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Springboot整合多数据源代码示例详解

    Springboot整合多数据源代码示例详解

    这篇文章主要介绍了Springboot整合多数据源代码示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • springboot项目整合注册功能模块开发实战

    springboot项目整合注册功能模块开发实战

    这篇文章主要介绍了springboot项目整合注册功能模块开发实战,在用户的注册是首先需要查询当前的用户名是否存在,如果存在则不能进行注册,相当于一个查询语句,本文通过实例代码详细讲解,需要的朋友可以参考下
    2022-11-11
  • 零基础写Java知乎爬虫之获取知乎编辑推荐内容

    零基础写Java知乎爬虫之获取知乎编辑推荐内容

    上篇文章我们拿百度首页做了个小测试,今天我们来个复杂的,直接抓取知乎编辑推荐的内容,小伙伴们可算松了口气,终于进入正题了,哈哈。
    2014-11-11
  • 在Mybatis使用Integer与''进行比较的坑及解决

    在Mybatis使用Integer与''进行比较的坑及解决

    这篇文章主要介绍了在Mybatis使用Integer与''进行比较的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java简单实现线程池

    Java简单实现线程池

    这篇文章主要为大家详细介绍了Java简单实现线程池,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • springboot json时间格式化处理的方法

    springboot json时间格式化处理的方法

    这篇文章主要介绍了springboot json时间格式化处理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • java 在Jetty9中使用HttpSessionListener和Filter

    java 在Jetty9中使用HttpSessionListener和Filter

    这篇文章主要介绍了java 在Jetty9中使用HttpSessionListener和Filter的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论