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

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

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

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

    java操作IE代理

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

    lotus domnio java代理输出html代理

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

    Java中使用IE Proxy代理的方法

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

    Java代理服务器程序

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

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

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

    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实现免费代理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 ...

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

    Java静态代理与动态代理demo

    在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...

Global site tag (gtag.js) - Google Analytics