本文实例讲述了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()时存储一次字段来减少性能开销。但是,找到这些值可能会贵得多。 由于反射的作用,