当前位置: 首页 > 编程笔记 >

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

方增
2023-03-14
本文向大家介绍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或. class文件。使用它的唯一方法AFAIK是通过反思。 我已经做的是编写一个小程序来获取我的目标类的实例,迭代它的公共方法/字段并获得它们的签名(类似于这个程序)。这将给我一个. java源文件的框架。然后我手动填充这些方法的主体,以便它们使用反射调用真正的方法。所谓的Java文件是javac编译的,还有我的用户代码。这样,

  • 本文向大家介绍Java JDK 动态代理的使用方法示例,包括了Java JDK 动态代理的使用方法示例的使用技巧和注意事项,需要的朋友参考一下 本文主要和大家分享介绍了关于Java JDK 动态代理使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 前言 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消

  • 本文向大家介绍Java反射和动态代理的区别(JDK Proxy和Cglib)相关面试题,主要包含被问及Java反射和动态代理的区别(JDK Proxy和Cglib)时的应答技巧和注意事项,需要的朋友参考一下 反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 反射机制是 Jav

  • 本文向大家介绍Java使用反射操作数组示例,包括了Java使用反射操作数组示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java使用反射操作数组。分享给大家供大家参考,具体如下: 一 实战 1 代码 2 运行 E:\Java\疯狂java讲义\codes\18\18.4>java ArrayTest1 疯狂Java讲义 轻量级Java EE企业应用实战 二 实战 1 代码 2 运行

  • 本文向大家介绍详解Java反射实现Aop代理,包括了详解Java反射实现Aop代理的使用技巧和注意事项,需要的朋友参考一下 利用反射生成JDK的动态代理,也就是AOP中的AOP代理,代替目标对象,从而在代码中织入增强。 定义代理接口 由于JDKf动态代理只能为接口创建动态代理,故先定义接口,假定我们需要对数据的Save方法添加事务处理,我们有一个UserDao接口,里面有一个Save方法,代码如下

  • 问题内容: 前几天,我通过手动将类的每个元素写成String来为Java中的类编写toString(),我想到使用反射可能可以创建一个通用的toString()方法在所有课程上。IE浏览器将找出字段名称和值,并将其发送到字符串。 获取字段名称非常简单,这是同事提出的: 使用工厂,我可以通过在第一次调用toString()时存储一次字段来减少性能开销。但是,找到这些值可能会贵得多。 由于反射的作用,