- 浏览: 579785 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
拯救各种不开心:
多谢博主分享,已经收藏:http://www.iwwenbo. ...
java反射机制详解 及 Method.invoke解释 -
Santer.Zhang:
你好,我用的是ireport4.5.1,子表一直无法显示
ireport 的一些技巧 -
Ginger90:
ireport实用性上没有帆软报表好用
ireport 的一些技巧 -
lenghongliang001:
破解版不行了,要注册才行
java实现tts(语音开发) -
best_programmer:
得到某个类的静态属性好像用你的方法不对啊,只能使用暴力反射吗? ...
java反射机制详解 及 Method.invoke解释
拦截器:
1、首先要有一个目标对象,要拦截谁
2、拦截对象,拦截器本身只是一个普通的类
3、对目标对象所生成的一个代理对象,真正去执行的是代理对象,代理对象也是有若干个方法
由系统动态产生出来的,并不是我们去写出来的,代理对象的方法与目标对象的方法很类似,但是
代理对象的方法是综合了拦截器的方法和跟你的系统的目标对象的方法,将其综合起来,就形成了代
理对象的方法,也就是说代理方法是拦截器方法与目标对象方法的一个结合体
理清的关系:
Target是目标对象,是目标,代理谁
Interceptor是拦截器,将方法动态的插入到目标对象Target方法之前或是之后去执行
这些Target与Interceptor互相不知道,Target不知道被谁插入,Interceptor也不知道插入到哪里。
因此在这声明一个MyHandler处理器,真正去调用目标对象方法,调用目标对象方法之前,执行拦截器的before
(),调用目标对象方法之后执行拦截器的after();
还有一个最重要的代理对象MyProxy,有一个getProxy()方法,传过来目标对象,在此将目标对象set到处理器里
面去myHandler.setObject(object);然后返回一个代理实例,通过代理实例来调用目标对象的方法,目标对象方
法执行之后就会去调用拦截器,则相当于拦截器对其拦截了。
总结拦截器:
角色:
1、被拦截的对象或目标,目标对象的方法被拦截
2、拦截器本身,普通的class类,行为上来说起到了拦截别人的作用
3、代理,通过代理生成对目标对象的一个代理,执行的不是目标对象,而是代理,在代理中已经插入了拦截器
,这样的作用是降低偶合
目标对象与拦截器本身是互不关联的,低偶合,通过myHandler/myporxy来偶合,在struts2中是通过xml配置文件
来偶合的.代码程次是不偶合的.
拦截器底层实现就是动态代理实现的。
实例:
因为JDK动态代理只能对实现了接口的实例来生成代理,故提供一个接口。
public interface Dog { public void info(); public void run(); }
实现Dog类。
public class DogImpl implements Dog { public void info() { System.out.println("我是一匹狼"); } public void run() { System.out.println("我奔跑迅速"); } }
拦截Dog实例的拦截器的拦截器类。
public class DogIntercepter { public void method1() { System.out.println("=====模拟通用方法一====="); } public void method2() { System.out.println("=====模拟通用方法二====="); } }
下面是JDK反射体系里的一个接口,它可以动态调用目标对象的方法。该类实现了java.lang.reflect.InvocationHandler接口。
public class ProxyHandler implements InvocationHandler { private Object target; DogIntercepter di = new DogIntercepter(); public Object invoke(Object proxy, Method method, Object[] args)throws Exception { Object result = null; if (method.getName().equals("info")) { di.method1(); result = method.invoke(target, args); System.out.println("methodname=="+method.getName()); System.out.println("target==="+target); System.out.println("proxy==="+proxy); di.method2(); } else { result = method.invoke(target, args); } System.out.println("result="+result); return result; } public void setTarget(Object o) { this.target = o; } }
系统还需要提供一个代理工厂,它的主要作用就是根据目标对象生成一个代理对象。
public class MyProxyFactory { public static Object getProxy(Object object) { //Dog控制类 代理的操作类 ProxyHandler handler = new ProxyHandler(); //把该dog实例托付给代理操作 handler.setTarget(object); //第一个参数是用来创建 动态代理 的ClassLoader对象,只要该对象能访问Dog接口即可。 //也就只要DogImpl与Dog在同一 System.out.println("111---"+object.getClass()); System.out.println("222---"+object.getClass().getInterfaces()[0]); return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),handler); } }
Proxy.newProxyInstance方法根据接口数组动态创建代理实例,接口数组通过object.getClass().getInterfaces()方法获得,该类实现传入参数里接口数组的全部接口,因此Dynamic Proxy要求被代理的必须是接口的实现类,否则无法为其构造相应的动态实例。
下面是主程序:
public class TestDog { public static void main(String[] args) { Dog targetObject = new DogImpl(); Dog dog = null; Object proxy = MyProxyFactory.getProxy(targetObject); System.out.println("proxy="+proxy.getClass().getName()); if (proxy instanceof Dog) { dog = (Dog)proxy; System.out.println(dog.getClass()); } dog.info();//dog是代理类,当它调用方法时,会自动调用InvocationHandler子类的invoke方法 dog.run(); } }
以上就是一个简单的代理实现过程。
其实动态代理就是动态地帮你写了一个代理类,并实现了被代理接口。这个代理类$proxy0的父类把InvocationHandler实现聚合进来(h属性), 这样客户端可以强转成被代理接口(因为代理类也实现了这个接口),调用的时候动态代理类就调用父类的h.invoke()(h也就是你的InvocationHandler实现),h里面再调用target的这个方法,也就是真正的方法调用。从而达到动态调用的作用。
发表评论
-
字符串、图片 与 base64 转化 代码
2010-12-10 15:53 7305一、字符串与base64转化 /** * 用于 BASE ... -
类.class和类对象.getClass()、Class.forName("类名")的区别
2010-11-26 09:54 26591)Class cl=A.class; JVM将使用类A的类装 ... -
System.load 和 System.loadLibrary详解--同时可以解决未加载dll错误
2010-11-09 10:31 3451System.load 和 System.loadLibrar ... -
将斜杠替换为两个斜杠---replaceAll()
2010-05-12 19:31 5946java replaceAll() 方法要用 4 个反斜杠,表 ... -
java中抽象类跟接口的区别
2010-03-18 11:47 8144今天无意在网上看到抽 ... -
解读Tomcat服务器server.xml文件
2009-12-09 12:52 1302<Server port="8005& ... -
jsp页面放到WEB-INF 跟webroot的区别
2009-11-02 16:51 12056JSP存放在 WEB-INF 跟webroot的区别 ... -
jsp的跳转问题(redirect forword include 及区别)
2009-11-02 16:30 2636Forward高, Redirect低, 因为Redirec ... -
java中变量值的变化顺序
2009-10-26 13:33 1389父类--静态变量 父类--静态初始化块 子类--静态变量 子类 ... -
meta用法及robots.txt的讲解
2009-10-13 10:28 1730关于Meta的用法 meta是用来在HTML文档中模拟HTTP ... -
Java关键字final、static使用总结
2009-08-31 13:24 2526Java关键字final、static使用总结 一、final ... -
JNDI是什么
2009-08-31 12:01 1538JNDI是 Java 命名与目录接口(Java Naming ... -
java反射机制详解 及 Method.invoke解释
2009-07-21 09:33 89608JAVA反射机制 JAVA反射机 ... -
java中的加载器
2009-07-20 10:24 1546java是具有动态性,什么是动态性?有个最直观的例 ... -
synchronized的使用及说明
2009-07-14 15:33 1514synchronized的作用 一、同步方法public sy ... -
浅谈synchronized
2009-07-14 15:25 1122总的说来,synchronized关键字可以作为函数的修饰符, ... -
BufferedReader、FileReader、FileInputStream的区别
2009-07-10 11:48 10781BufferedReader 由Reader类扩展 ... -
java中的循环
2009-06-25 16:39 12081.while循环: int i = 1; int sum ... -
form中post和get的区别
2009-06-22 16:45 2041Form中的get和post方法,在数据传输过程中分别对应了H ... -
jspsmart实现文件上传下载
2009-06-18 23:16 577今天弄文件上传的时 ...
相关推荐
Proxy类提供了静态方法`newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`用于创建代理实例,其中loader是类加载器,interfaces是被代理的接口数组,h是实现InvocationHandler的实例...
本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中的选择。 首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象...
### JDK动态代理详解 #### 一、引言 在软件工程中,代理模式是一种常见的设计模式,它通过为一个对象提供一个替代品或占位符来控制对这个对象的访问。这种模式通常用于添加额外的功能(例如日志记录、事务管理等)...
### 关于JDK动态代理的源码剖析 #### 一、引言 在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入...
JDK动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理类实例。这种技术在很多场景下都非常有用,比如在AOP(面向切面编程)中实现方法拦截、日志记录、事务管理等。下面我们将深入...
动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...
JDK 动态代理技术详解 JDK 动态代理技术是 Java 语言自身对动态代理的支持,类似于 JDK 中在 java.util 包中提供 Observable 类和 Observer 接口提供对观察者模式的语言级支持。动态代理的优点是可以动态地为软件...
在Java编程领域,JDK动态代理是一个非常重要的概念,它允许我们在运行时动态地创建一个实现了特定接口的代理对象,以此来拦截并扩展原有对象的行为。动态代理在很多场景下都有应用,比如AOP(面向切面编程)、事件...
在Java编程领域,JDK动态代理是实现动态创建代理对象的一种技术,它是Java标准库提供的一种强大工具。Spring AOP(面向切面编程)则是一种流行的应用框架,它利用动态代理来实现对业务代码的切面增强,如日志、事务...
在Nginx中配置负载均衡,你需要定义一个upstream块,指定后端服务器(如多个Tomcat实例),然后在server块中使用proxy_pass指令将请求转发到upstream。同时,Nginx还可以缓存静态资源,进一步提升响应速度。 为了...
JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....
本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...
- Proxy通过`Proxy.newProxyInstance()`方法创建一个新的代理实例,它接收三个参数:类加载器、接口数组和InvocationHandler实例。代理对象会实现传入的接口,这样就可以在运行时调用这些接口的方法。 - 代理对象...
本篇将详细探讨JDK动态代理和Cglib动态代理,并通过源码实例来加深理解。 首先,JDK动态代理是Java内置的一种机制,它依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类...
本文将深入探讨Spring如何利用JDK动态代理技术来实现这一功能,并通过实例解析其底层实现。 首先,让我们理解什么是JDK动态代理。在Java中,动态代理是一种在运行时创建代理类的能力,它允许我们为一组接口创建代理...
- **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...
在本文中,我们将深入探讨如何模拟JDK的动态代理内部实现。 首先,我们需要了解JDK动态代理的基础知识。Java中的动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。`Proxy...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
本篇将深入探讨两种主要的Java动态代理技术:JDK动态代理和CGLIB。 首先,我们来了解一下JDK动态代理。JDK动态代理基于Java反射API实现,主要用于接口代理。以下是一个简单的JDK动态代理的使用步骤: 1. **定义...