- 浏览: 1590293 次
- 来自: 上海
文章分类
- 全部博客 (374)
- Java (101)
- Struts (54)
- Oracle (30)
- JavaScript (16)
- Spring (27)
- Hibernate (16)
- MyEclipse (3)
- JSF (1)
- FreeMarker (2)
- SiteMesh (2)
- JfreeChart (2)
- Ibatis (2)
- JSP (12)
- MyBatis (4)
- SWFupload (1)
- EJB (4)
- Jboss (4)
- WebService (2)
- Linux (16)
- Android (2)
- XML (6)
- Java 网络编程 (13)
- AXIS2 (1)
- FTP (1)
- Jswing (1)
- Socket (3)
- 杂文选集 (6)
- solr (2)
- PS (1)
- Tomcat (7)
- JDBC (9)
- Highcharts (1)
- maven (1)
- Nodejs (0)
- navicat (2)
- Exception (5)
- eclipse (3)
- jQuery (1)
- springMVC (4)
- MySQL (11)
- SVN (1)
- Sql Server (1)
- zookeeper (1)
- JVM (1)
- Groovy (2)
- Git (1)
- Nginx (1)
- DynamicReport (1)
- IDEA (2)
- JasperReports (1)
- Postgresql (2)
- Mac (1)
- gradle (1)
- 数据结构算法 (1)
最新评论
-
hpu145:
引用引用
java 千分位的添加和去除 -
被遗忘的下路:
少了个junit-4.8.2的包
SSH2整合完整案例(四十三) -
白天看黑夜:
java过滤emoji字符处理,希望能帮到你http://ww ...
emoji 表情图片解决方法 -
caipeiming:
这个挺好JavaScript实现input输入框控件只允许输入 ...
js 控制文本框只能输入中文、英文、数字等 -
双子树:
东西太好啦受教啊
Struts2 JSP中将list,set ,Map传递到Action然后<s:iterator>遍历(三十五)
Proxy(代理) AOP(面向切面编程) a) 为程序中具有多个相同接口的目标类各增加一些系统功能.例如.异常处理,日志,计算方法的运行时间.事物管理,等待. b) AOP系统中存在交叉业务(安全,事物,日志),每个交叉业务要贯穿系统中的每个模块,代理就是实现AOP功能的核心技术和关键技术 c) 动态代理.JVM可以在运行期动态的生成出类的字节码,这种动态生成的类用作代理, d) JVM生成的动态类必须实现一个或者多个接口,所以JVM生成的动态类只能用作具有相同接口目标类的代理。 e) CGLIB库可以动态生成没有接口类的子类,一个类的子类也可以用作该类的代理,所以使用CGLIB也可以实现代理。
package com.enhance.proxy; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; /** * 使用代理创建对象 并获取对象的各种属性 * InvocationHandler * Object 只将 hashCode toString equals() 委托给 InvocationHandler 处理,其他的 方法没有委托给InvocationHandler 处理 */ public class ProxyTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub Class clazzProxy=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class); System.out.println(clazzProxy.getName()); System.out.println("---------begin constructor list---------"); Constructor[] constructors=clazzProxy.getConstructors(); for (Constructor constructor : constructors) { String name=constructor.getName(); StringBuilder sbr=new StringBuilder(name); sbr.append('('); Class[] clazzParams=constructor.getParameterTypes(); for (Class clazzParam : clazzParams) { sbr.append(clazzParam.getName()).append(','); } if(clazzParams!=null && clazzParams.length>0) sbr.deleteCharAt(sbr.length()-1); sbr.append(')'); System.out.println(sbr.toString()); } System.out.println("---------begin Method list---------"); Method[] methods=clazzProxy.getMethods(); for (Method method : methods) { String name=method.getName(); StringBuilder sbr=new StringBuilder(name); sbr.append('('); Class[] clazzParams=method.getParameterTypes(); for (Class clazzParam : clazzParams) { sbr.append(clazzParam.getName()).append(','); } if(clazzParams!=null && clazzParams.length>0) sbr.deleteCharAt(sbr.length()-1); sbr.append(')'); System.out.println(sbr.toString()); } System.out.println("---------begin Create Object ---------"); //第一种写法 Constructor con=clazzProxy.getConstructor(InvocationHandler.class); class MyInvocationHandler implements InvocationHandler{ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub return null; } } Collection poxy1=(Collection)con.newInstance(new MyInvocationHandler()); System.out.println(poxy1); System.out.println(poxy1.toString());//对象不为空,但是 tostring()返回的是null 是因为 invoke返回的是null 所以就是null. poxy1.clear(); //能成功调用 // poxy1.size(); //不能成功调用 NullException 原因 就是 上面的 InvocationHandler 的invoke 返回的是 null ,而 size 要返回的是int ,无法将null 转换成 int类型 所以就异常了 //第二种写法 Collection poxy2=(Collection)con.newInstance(new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub return null; } }); //第三种写法 Collection proxy3=(Collection)Proxy.newProxyInstance( Collection.class.getClassLoader(), new Class[]{Collection.class}, new InvocationHandler(){ ArrayList target=new ArrayList(); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //使用代理 来获取方法执行的时间 //或者 使用过滤器 来过滤 用户的非法内容 //或者 加入日志 加入事务 等等 long stime=System.currentTimeMillis(); Thread.sleep(10); Object retVal=method.invoke(target, args); long etime=System.currentTimeMillis(); System.out.println(method.getName()+" runing time is "+(etime-stime)); return retVal; } }); Object obj= proxy3.add("zxx"); System.out.println("returnVal :"+obj); proxy3.add("lhm"); proxy3.add("bxd"); System.out.println(proxy3.size()); //接下来 将 上面的方法 抽取一个公共方法. } }
简单的代理
package com.enhance.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; public class ProxyUtil { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub final ArrayList list=new ArrayList(); Collection proxy=(Collection)getProxy(list, new MyAdvice()); proxy.add("zxx"); proxy.add("lhm"); proxy.add("bxd"); System.out.println(proxy.size()); } public static Object getProxy(final Object target,final Advice advice){ Object proxy=Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advice.beforeMethod(method); Object val=method.invoke(target, args); advice.afterMethod(method); return val; } }); return proxy; } }
package com.enhance.proxy; import java.lang.reflect.Method; public interface Advice { void beforeMethod(Method method); //方法之前运行的代码 void afterMethod(Method method); //方法之后运行的嗲吗 void exceptionMethod(Method method); //方法异常运行的代码 void beforeAfterMethod(Method method);//方法前后运行的代码 } //------------------------------------------ package com.enhance.proxy; import java.lang.reflect.Method; public class MyAdvice implements Advice{ long etime=0; long stime=0; @Override public void beforeMethod(Method method) { // TODO Auto-generated method stub System.out.println("开始学习啦!"); stime=System.currentTimeMillis(); } @Override public void afterMethod(Method method) { // TODO Auto-generated method stub System.out.println("学习结束了!"); etime=System.currentTimeMillis(); System.out.println(method.getName()+" runing time is "+(etime-stime)); } @Override public void exceptionMethod(Method method) { // TODO Auto-generated method stub } @Override public void beforeAfterMethod(Method method) { // TODO Auto-generated method stub } }
//mini AOPFreamework
package com.enhance.proxy.aopfreamwork; import java.io.InputStream; public class AopFrameworkTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub InputStream ips=AopFrameworkTest.class.getResourceAsStream("config.properties"); Object bean=new BeanFactory(ips).getBean("xxx"); System.out.println(bean.getClass().getName()); } }
package com.enhance.proxy.aopfreamwork; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import com.enhance.proxy.Advice; public class BeanFactory { private Properties props=new Properties(); public BeanFactory(InputStream ips) { try { props.load(ips); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Object getBean(String name){ String className=props.getProperty(name); Object bean=null; try { Class clazz=Class.forName(className); bean=clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } if(bean instanceof ProxyFactoryBean){ ProxyFactoryBean proxyBean=((ProxyFactoryBean)bean); Advice advice=null; Object target=null; try { advice=(Advice)Class.forName(props.getProperty(name+".advice")).newInstance(); target = Class.forName(props.getProperty(name+".target")).newInstance(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } proxyBean.setAdvice(advice); proxyBean.setTarget(target); Object proxy=proxyBean.getProxy(); return proxy; } return bean; } }
package com.enhance.proxy.aopfreamwork; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.enhance.proxy.Advice; public class ProxyFactoryBean { private Advice advice; private Object target; public Object getProxy() { Object proxy=Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advice.beforeMethod(method); Object val=method.invoke(target, args); advice.afterMethod(method); return val; } }); return proxy; } public Advice getAdvice() { return advice; } public void setAdvice(Advice advice) { this.advice = advice; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } }
//配置文件
#xxx=java.util.ArrayList xxx=com.enhance.proxy.aopfreamwork.ProxyFactoryBean xxx.advice= com.enhance.proxy.MyAdvice xxx.target=java.util.ArrayList
发表评论
-
检测一个字符串是否在jvm的常量池中
2018-12-18 17:34 998public static boolean inPool( ... -
UTC时间, GMT时间 ,夏令时
2017-08-18 15:12 2282经常混淆于此,特地研究了一下,记录在此以备忘。 整个地 ... -
java 反射List
2017-02-18 01:58 5654package com.enhance.reflect; ... -
JDK1.5 Exchange 两个线程互换数据
2016-08-04 18:00 988import java.util.concurrent ... -
JDK1.5 CountDownLatch
2016-08-04 16:25 1055/* * 还有一个利用场景: ... -
java CyclicBarrier 循环障碍阻塞
2016-08-03 23:54 1009//一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ... -
java 信号灯 Semaphore
2016-08-03 23:53 1826更多介绍http://blog.csdn.net/java20 ... -
java 使用读写锁设计一个缓存模型
2016-08-03 23:49 1417import java.util.HashMap; ... -
java 读写锁
2016-08-03 23:46 816import java.util.Random; i ... -
java 多个线程之间同步通信
2016-08-02 17:16 2397import java.util.concurrent ... -
jdk1.5 锁 Lock 和 Condition
2016-08-02 17:03 925// lock 练习 public class Lock ... -
JDK1.5 获取线程执行结果 Callable Future
2016-08-02 15:08 1174import java.util.Random; i ... -
JDK1.5 线程池
2016-08-02 14:48 802import java.util.concurrent ... -
java 多线程ThreadLocal
2016-08-02 00:13 1145import java.util.Random; ... -
java 定时器 Timer
2016-08-01 16:53 3893import java.util.Calendar; ... -
java 多线程同步+通信
2016-08-01 16:48 965/** *父子线程 交替打印10 次, 100次 ... -
java 线程同步
2016-08-01 16:43 1023import java.util.concurrent.l ... -
java多线程练习
2016-08-01 16:35 1842Java 传统多线程 Java 多线程同步 Java 多线 ... -
java 传统多线程
2016-08-01 16:34 1005/** * 传统多线程 */ public ... -
java 图片,剪切,缩放
2016-01-06 10:21 2230package out; import ja ...
相关推荐
在Java编程环境中,当需要通过局域网(LAN)进行网络通信时,有时会遇到需要使用代理服务器的情况。代理服务器可以提供多种功能,包括提高访问速度、缓存、过滤网络内容以及匿名上网等。本文将深入探讨如何在Java中...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
在 Lotus Domino Java 代理中,我们可以使用 `PrintWriter` 对象来输出 JSON 字符串。例如: ```java PrintWriter printOutput = this.getAgentOutput(); printOutput.println("Content-type: application/json;...
在Java编程中,有时我们需要模拟用户的网络环境,例如设置IE(Internet Explorer)浏览器的代理以进行自动化测试或者数据抓取。这个"java操作IE代理"的主题涉及到如何在Java程序中控制IE的网络代理设置,这通常需要...
1. Lotus Domino Java代理的使用。 2. 使用`Session`对象与服务器交互。 3. `PrintWriter`用于生成HTTP响应的HTML内容。 4. 数据库和视图的操作,包括打开、索引检查以及文档的读取。 5. 遵循Apache 2.0许可的开源...
本文将详细介绍如何在Java中使用IE Proxy代理来实现这一功能。 首先,我们需要理解Java中的网络访问机制。Java使用`java.net`包中的`Socket`和`HttpURLConnection`等类来处理网络通信。当程序运行时,它会使用系统...
Java代理服务器程序是一种用于转发网络请求的应用,它在客户端与目标服务器之间起到中介的作用。这样的设计使得用户可以通过代理服务器访问互联网,从而实现多种功能,如匿名浏览、负载均衡、缓存优化、网络监控等。...
Java代理机制是Java编程中一个重要的特性,它允许我们在不修改原有代码的基础上,为已有类增加额外的功能。本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口...
3: 动态代理使用到基础理论:ClassLoader 加载.class字节码文件得到 , Class对象, Class对象通过 newProxyInstance 得到代理对象 4: 动态代理使用到基础理论:Class.forName("xxxx") 得到Class类 。
本主题将深入探讨如何使用Java语言来编写这样的代理服务器。以下是对这个主题的详细解析: 首先,理解HTTP代理服务器的基本原理是必要的。HTTP代理服务器作为客户端与目标服务器之间的中介,它接收客户端的HTTP请求...
"lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理之间传递参数。 首先,让我们了解一下Lotus Domino Java代理的基本概念。在Lotus Domino Designer中,Java代理是用Java语言...
Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...
3. 创建并使用动态代理: ```java Service realService = new RealService(); Service proxyService = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class[]{Service.class}, new ...
获取网络资源,使用动态代理ip解决单个ip访问次数限制问题
- `Main.java`: 主程序,创建代理对象并调用其方法,展示动态代理的使用。 通过这个简单的Java动态代理demo,你可以了解到如何在实际项目中利用动态代理进行功能扩展,同时避免了为每个接口编写单独的代理类。这种...
HTTP代理服务器java 简单网站过滤
4. **使用代理对象**:最后,客户端通过代理对象调用方法,实际上执行的是真实对象和代理对象共同完成的工作: ```java public class Client { public static void main(String[] args) { Service real = new ...
以上就是Java动态代理的基本使用方式。通过这种方式,我们可以在不修改原有业务逻辑的情况下,为对象添加如日志记录、事务管理、性能统计等功能。在实际开发中,动态代理常用于AOP(面向切面编程)框架,如Spring ...
Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...
在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...