`
Luob.
  • 浏览: 1586358 次
  • 来自: 上海
社区版块
存档分类
最新评论

java 代理的使用

    博客分类:
  • Java
阅读更多
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
0
3
分享到:
评论

相关推荐

    java LAN使用代理服务器

    在Java编程环境中,当需要通过局域网(LAN)进行网络通信时,有时会遇到需要使用代理服务器的情况。代理服务器可以提供多种功能,包括提高访问速度、缓存、过滤网络内容以及匿名上网等。本文将深入探讨如何在Java中...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    java操作IE代理

    在Java编程中,有时我们需要模拟用户的网络环境,例如设置IE(Internet Explorer)浏览器的代理以进行自动化测试或者数据抓取。这个"java操作IE代理"的主题涉及到如何在Java程序中控制IE的网络代理设置,这通常需要...

    Java中使用IE Proxy代理的方法

    本文将详细介绍如何在Java中使用IE Proxy代理来实现这一功能。 首先,我们需要理解Java中的网络访问机制。Java使用`java.net`包中的`Socket`和`HttpURLConnection`等类来处理网络通信。当程序运行时,它会使用系统...

    Java代理服务器程序

    Java代理服务器程序是一种用于转发网络请求的应用,它在客户端与目标服务器之间起到中介的作用。这样的设计使得用户可以通过代理服务器访问互联网,从而实现多种功能,如匿名浏览、负载均衡、缓存优化、网络监控等。...

    java代理机制 JDK动态代理和cglib代理 详解

    Java代理机制是Java编程中一个重要的特性,它允许我们在不修改原有代码的基础上,为已有类增加额外的功能。本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口...

    lotus domino java代理_获取传递值json

    在 Lotus Domino Java 代理中,我们可以使用 `PrintWriter` 对象来输出 JSON 字符串。例如: ```java PrintWriter printOutput = this.getAgentOutput(); printOutput.println("Content-type: application/json;...

    java + 动态代理 + 动态代理实际应用场景

    3: 动态代理使用到基础理论:ClassLoader 加载.class字节码文件得到 , Class对象, Class对象通过 newProxyInstance 得到代理对象 4: 动态代理使用到基础理论:Class.forName("xxxx") 得到Class类 。

    Java写http代理服务器

    本主题将深入探讨如何使用Java语言来编写这样的代理服务器。以下是对这个主题的详细解析: 首先,理解HTTP代理服务器的基本原理是必要的。HTTP代理服务器作为客户端与目标服务器之间的中介,它接收客户端的HTTP请求...

    lotus domnio java代理传值

    "lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理之间传递参数。 首先,让我们了解一下Lotus Domino Java代理的基本概念。在Lotus Domino Designer中,Java代理是用Java语言...

    Java代理服务器的实现

    "Java线程" 提示代理服务器可能使用多线程来处理并发的客户端请求,这是在Java中实现高效代理服务器的关键。"另类其它" 标签可能指的是该实现包含了一些不常见或非标准的代理服务器特性,如自定义协议支持或其他网络...

    java实现免费代理IP的获取方式 并实时校验代理IP是否有效

    Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...

    JAVA静态代理和动态代理

    3. 创建并使用动态代理: ```java Service realService = new RealService(); Service proxyService = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class[]{Service.class}, new ...

    lotus domnio java代理输出html代理

    1. Lotus Domino Java代理的使用。 2. 使用`Session`对象与服务器交互。 3. `PrintWriter`用于生成HTTP响应的HTML内容。 4. 数据库和视图的操作,包括打开、索引检查以及文档的读取。 5. 遵循Apache 2.0许可的开源...

    java使用proxy类设置代理ip

    获取网络资源,使用动态代理ip解决单个ip访问次数限制问题

    java动态代理demo

    - `Main.java`: 主程序,创建代理对象并调用其方法,展示动态代理的使用。 通过这个简单的Java动态代理demo,你可以了解到如何在实际项目中利用动态代理进行功能扩展,同时避免了为每个接口编写单独的代理类。这种...

    HTTP代理服务器java

    HTTP代理服务器java 简单网站过滤

    Java设计模式——代理设计模式(静态代理和动态代理)

    4. **使用代理对象**:最后,客户端通过代理对象调用方法,实际上执行的是真实对象和代理对象共同完成的工作: ```java public class Client { public static void main(String[] args) { Service real = new ...

    java动态代理类的实例

    以上就是Java动态代理的基本使用方式。通过这种方式,我们可以在不修改原有业务逻辑的情况下,为对象添加如日志记录、事务管理、性能统计等功能。在实际开发中,动态代理常用于AOP(面向切面编程)框架,如Spring ...

    java代理模式

    Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...

Global site tag (gtag.js) - Google Analytics