- 浏览: 22568 次
- 性别:
- 来自: 北京
最新评论
-
Catherine_f:
太帅了,我的也是这个错误,删了就好了
java.lang.NoSuchMethodError: javax.servlet.jsp.JspFactory.getJspApplicationConte -
511930751:
不错,不错,正在做一个可定制的问卷调查,在后台创建问卷时,需要 ...
struts处理多行数据同时提交
Java 静态代理和动态代理
关键字: 静态代理与动态代理
1. 代理模式主要有两种:静态代理和动态代理
2. 静态代理:
比如要在输出“HelloWorld”前打印一个字符串“Welcome”
A:先定义一个接口类
B: 定义一个该接口的实现类
java 代码
C:定义一个静态代理类
D: 一个测试类:
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。
3 。动态代理
动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
代理类:
测试类:
2. 静态代理:
比如要在输出“HelloWorld”前打印一个字符串“Welcome”
A:先定义一个接口类
- package ttitfly.proxy;
- public interface HelloWorld {
- public void print();
- // public void say();
- }
package ttitfly.proxy; public interface HelloWorld { public void print(); // public void say(); }
B: 定义一个该接口的实现类
java 代码
- package ttitfly.proxy;
- public class HelloWorldImpl implements HelloWorld{
- public void print(){
- System.out.println("HelloWorld");
- }
- // public void say(){
- // System.out.println("Say Hello!");
- // }
- }
package ttitfly.proxy; public class HelloWorldImpl implements HelloWorld{ public void print(){ System.out.println("HelloWorld"); } // public void say(){ // System.out.println("Say Hello!"); // } }
C:定义一个静态代理类
- package ttitfly.proxy;
- public class StaticProxy implements HelloWorld{
- public HelloWorld helloWorld ;
- public StaticProxy(HelloWorld helloWorld){
- this.helloWorld = helloWorld;
- }
- public void print(){
- System.out.println("Welcome");
- //相当于回调
- helloWorld.print();
- }
- // public void say(){
- // //相当于回调
- // helloWorld.say();
- // }
- }
package ttitfly.proxy; public class StaticProxy implements HelloWorld{ public HelloWorld helloWorld ; public StaticProxy(HelloWorld helloWorld){ this.helloWorld = helloWorld; } public void print(){ System.out.println("Welcome"); //相当于回调 helloWorld.print(); } // public void say(){ // //相当于回调 // helloWorld.say(); // } }
D: 一个测试类:
- package ttitfly.proxy;
- public class TestStaticProxy {
- public static void main(String[] args){
- HelloWorld helloWorld = new HelloWorldImpl();
- StaticProxy staticProxy = new StaticProxy(helloWorld);
- staticProxy.print();
- // staticProxy.say();
- }
- }
package ttitfly.proxy; public class TestStaticProxy { public static void main(String[] args){ HelloWorld helloWorld = new HelloWorldImpl(); StaticProxy staticProxy = new StaticProxy(helloWorld); staticProxy.print(); // staticProxy.say(); } }
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。
3 。动态代理
动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
代理类:
- package ttitfly.proxy;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- //动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
- public class DynamicProxy implements InvocationHandler{
- private Object object;
- //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
- //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
- public Object bindRelation(Object object){
- this.object = object;
- return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
- }
- //拦截关联的这个实现类的方法被调用时将被执行
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("Welcome");
- Object result = method.invoke(object, args);
- return result;
- }
- }
package ttitfly.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类 public class DynamicProxy implements InvocationHandler{ private Object object; //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。 //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法 public Object bindRelation(Object object){ this.object = object; return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this); } //拦截关联的这个实现类的方法被调用时将被执行 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Welcome"); Object result = method.invoke(object, args); return result; } }
测试类:
- package ttitfly.proxy;
- public class TestDynamicProxy {
- public static void main(String[] args){
- HelloWorld helloWorld = new HelloWorldImpl();
- DynamicProxy dp = new DynamicProxy();
- //在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。
- HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);
- helloWorld1.print();
- helloWorld1.say();
- //helloWorld2将不被拦截
- HelloWorld helloWorld2 = new HelloWorldImpl();
- helloWorld2.print();
- helloWorld2.say();
- }
- }
发表评论
-
epoll 或者 kqueue 的原理(摘自知乎蓝形参)
2015-06-07 16:29 926首先我们来定义流的概 ... -
如何开发线程安全的Servlet
2012-12-16 13:44 655如何开发线程安全的Servlet 先说明几个概念:工作者 ... -
POI经常使用的API
2012-12-13 10:42 704转载自:http://hi.baidu.com/sole ... -
在oracle中取出某列中为数字的数据
2012-11-16 17:30 1334假设test表中存在name字段 CREATE OR REP ... -
spring2.0Bean初始化)
2012-01-02 21:19 667spring2.0Bean初始化) Bean初始化 ... -
Java排序汇总
2011-05-26 01:04 685package com.softeem.jbs.lesson4 ... -
struts2的OGNL应用
2011-04-01 18:09 1062Struts 2中的OGNL 本人是一个EL(Expre ... -
JS获取select的value和text值
2011-03-10 12:36 995<script language="javas ... -
<s:textfield>中使用request范围内值作为默认值问题
2011-02-25 17:22 1439struts2在Action使用模型驱动 publ ... -
Hibernate查询解决方案
2011-01-17 17:08 614第一部分:Hibernate提供 ... -
Windows7下安装Oracle10g
2010-12-15 09:58 878Oracle官方网站上下载10203_vista_w ... -
一个牛人写的Java连接池
2010-11-12 10:36 714package ConnPool; import java. ... -
java.lang.NoSuchMethodError: javax.servlet.jsp.JspFactory.getJspApplicationConte
2010-10-13 10:45 1441HTTP Status 500 - type Except ... -
在使用MyEclipse过程中发现它对于对于Java代码的自动提示功能失灵了,而对于JSP却能正常给出提示
2010-09-28 15:26 1063在使用MyEclipse过程中发现它对于对于Java代码的自动 ... -
myeclipse+vss状态不显示问题
2010-09-27 09:24 1329以前用eclipse3.1 + myeclipse4.x和VS ... -
struts处理多行数据同时提交
2010-08-02 11:09 1122今天遇到提交多行数据问题, 在网上找了一点资料: WEB 应用 ... -
swing笔记
2010-04-25 21:51 1055Swing包是JFC(Java Foundatio ... -
swing的MVC
2010-04-25 21:44 1293说到MVC,大家都知道他是构建GUI的有力模型。不过MVC本身 ...
相关推荐
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
java静态代理和动态代理的区别,及其例子
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
一个静态代理和动态代理的小例子,开发时使用的工具是myeclipse,直接使用myeclipse工具导入即可,希望能 给大家理解这方面的入门知识带来些作用,同时也希望大家指出不足,我可以更加进行改进
java中代理的使用,包括静态代理、JDK动态代理、CGLIB动态代理的例子,想了解AOP和动态代理的童鞋可以看下
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容...
1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置...
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
1.静态导入:先举个离例子 。 import java.lang.Integer.parseInt; public class StaticImport { int x = parseInt("123"); System.out.println(x); } 这样的程序如果不在IDE 工具中输入,是很难看出这个程序代码...
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...
第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7...
Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...
14.3.1 静态代理 78 14.3.2 动态代理 84 14.4 DBCP数据库连接池的使用 87 第十五节 jdbc轻量级封装 88 15.1 将结果集封装为Map 88 15.1.1 ResultSetMetaData演示 88 15.1.2解决多行记录的问题 89 15.1.3 Map结果集的...
实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 实例165 空指针异常 213 7.4 常见的已检查型异常 214 实例166 类未发现异常 ...
java6string源码数据门户 概述 Dataportal 是一个 Grails 网络应用程序,它通常代理实时或静态数据集。 它通过 URL 端点和规范化的 JSON 接口公开您的数据集。 静态数据集 - Dataportal 将 JSON 静态文件加载到 ...