黑马程序员-高新技术-代理

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

代理:

程序中的代理:要为已存在的多个具有相同接口的目标类的各个方法添加一些系统功能,例如,异常处理日志、计算方法的运行时间、事务管理、等待。这是就需要编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。

如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类,还是代理类,这样以后很容易切换,譬如,想要日志功能时就配置代理类,否则配置目标类,这样添加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易。

术语:AOP(Aspect oriented program):面向方面的编程;

安全,事务,日志等功能要贯穿好多个模块中,所以他们就是交叉业务,交叉业务的编程问题即为面向方面的编程。代理是实现AOP功能的核心和关键技术。


动态代理技术: 

1,要为系统中的各种借口的类添加代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情!所以采用动态代理。

2,JVM可以在运行期动态生出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。

3,JVM生成的动态代理类必须实现一个或多个接口,所以,JVM生成的动态类智能用作具有相同接口的目标类的代理。

4,CGLIB库(不是jdk自带的,不是标准的。开源)可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。

5,代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:

在调用目标方法之前

在调用目标方法之后

在调用目标方法前后

在处理目标方法异常的catch块中


StringBuilder与StringBuffer的区别?

StringBuilder用于单线程不考虑线程安全效率高StringBuffer用于多线程考虑安全效率

创建动态类及查看其方法列表信息:

package cn.itcast.day3;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;

public class ProxyTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
		System.out.println(clazzProxy1.getName());
	
		
		System.out.println("begin constructors list -------------------------");
		Constructor[] constructors = clazzProxy1.getConstructors();
		for(Constructor constructor:constructors){
			String name = constructor.getName();
			StringBuilder sBuilder = new StringBuilder(name);
			sBuilder.append('(');
			Class[] clazzParams = constructor.getParameterTypes();
			for(Class clazzParam : clazzParams){
				sBuilder.append(clazzParam.getName()).append(',');
			}
			if(clazzParams!=null && clazzParams.length!=0)
				sBuilder.deleteCharAt(sBuilder.length()-1);
			sBuilder.append(')');
			System.out.println(sBuilder.toString());
		
		}	
		System.out.println("begin methods list -------------------------");
		Method[] methods = clazzProxy1.getMethods();
		for(Method method:methods){
			String name = method.getName();
			StringBuilder sBuilder = new StringBuilder(name);
			sBuilder.append('(');
			Class[] clazzParams = method.getParameterTypes();
			for(Class clazzParam : clazzParams){
				sBuilder.append(clazzParam.getName()).append(',');
			}
			if(clazzParams!=null && clazzParams.length!=0)
				sBuilder.deleteCharAt(sBuilder.length()-1);
			sBuilder.append(')');
			System.out.println(sBuilder.toString());
			
		}
		
	}

}




---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值