高新技术:代理

------- android培训java培训、期待与您交流! ----------

一、概述

1、定义

什么是代理?代理就是对目标对象提供一种代理以控制对这个对象的访问,像这些术语什么的最讨厌了,虽然表述正确,但是很难记,还是用通俗的话来概括一下,

我认为代理就是通过一个类访问另外一个类。

代理类与目标类(委托类)有同样的接口,代理是为了给目标类提供额外的处理或者不同的操作,如异常处理、运行时间、日志、事物管理等。

代理类的对象本身并不真正实现服务,而是通过调用目标类/委托类对象的相关方法提供服务。

有没有想起设计模式中的代理模式,是的,今天要讲的代理其实和设计模式中的代理模式从本质上来讲是一样的。

2、用代理有什么好处?

使用代理的目的主要的目的是为了对目标类,进行精确的控制。

我们在调用某个类的某个方法时,不仅要的到方法调用后的结果,还想再调用方法前后加上自己定义的一段程序并执行,这时使用代理技术就很方便了。

3、代理构架图

4、静态代理与动态代理

静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

动态代理:在程序运行时,运用反射机制动态创建而成。

也就是说,静态代理类运行前就有,动态代理类运行时才出现。

如果使用静态代理的话,我们就需要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情。

所以我们主要采用的是动态代理的方式。包括一些框架也是通过动态代理实现的。

二、创建动态类及查看方法

1,动态代理类创建代码(这里以Collection类为例)

//返回代理类的Class对象,参数(类加载器,实现的接口)
		Class clazzProxy = Proxy.getProxyClass(
				Collection.class.getClassLoader(), Collection.class);

2,获取动态代理类的构造方法

	private static void CreatConstructor(Class clazzProxy) {

		Constructor[] cons = clazzProxy.getConstructors();

		for (Constructor constructor : cons) {
			String name = constructor.getName();

			StringBuilder sb = new StringBuilder(name);
			sb.append('(');
			Class[] cls = constructor.getParameterTypes();
			for (Class class1 : cls) {
				sb.append(class1.getName()).append(',');
			}
			sb.append(')');

			System.out.println(sb + "......");
		}
	}

3,获取动态代理类的一般方法

	private static void CreatMethod(Class clazzProxy) {

		Method[] methods = clazzProxy.getMethods();

		for (Method method : methods) {
			String name = method.getName();

			StringBuilder sb = new StringBuilder(name);
			sb.append('(');
			Class[] cls = method.getParameterTypes();
			for (Class class1 : cls) {
				sb.append(class1.getName()).append(',');
			}
			sb.append(')');

			System.out.println(sb + "......");
		}
	}

三、创建动态代理类的实例对象及调用其方法

1,同过内部类方式实现

	private static void InstanceObj1(Class clazzProxy) throws Exception {
		// 根据creatConstructor()方法可知clazzProxy无构造方法
		//InvocationHandler:是代理实例的调用处理程序实现的接口。 仅包含一个方法invoke
		Constructor con = clazzProxy.getConstructor(InvocationHandler.class);
		//通过内部类形式实现该方法
		class MyInvocation implements InvocationHandler {

			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				//在这里写调用的Target(目标类)的具体操作
				return null;
			}
		}
		Collection proxy1 = (Collection) con.newInstance(new MyInvocation());
		System.out.println(proxy1);
	}

2,通过匿名内部类方式实现

/**
	 * 获得一个动态代理类,改写,通过匿名内部类
	 *
	 */
	private static void InstanceObj2(Class clazzProxy) throws Exception {
		// 根据creatCOnstructor()方法可知clazzProxy无构造方法
		Constructor con = clazzProxy.getConstructor(InvocationHandler.class);
		Object proxy1 = con.newInstance(new InvocationHandler() {

			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {

				return null;

			}

		});
		System.out.println(proxy1);
	}

3,通过Proxy.newProxyInstance()方法

/**
	 * 获得一个动态代理类,通过Proxy.newProxyInstance()方法
	 */
	private static void InstanceObj3() {
		Collection proxy1 = (Collection) Proxy.newProxyInstance(
				Collection.class.getClassLoader(),//第一个参数,定义代理类的类加载器
				new Class[] { Collection.class},  //第二个参数,代理类要实现的接口列表
				new InvocationHandler() {		  //第三个参数,指派方法调用的调用处理程序
					@Override
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {
						ArrayList target = new ArrayList();

						return method.invoke(target, args);

					}
				});

	}

四、动态代理类的实现原理

这副图还是很形象的,在画圈的部分添加自己的代码,客户端通过调用动态代理类的某方法,通过InvocationHandler接口的invoke()方法调用Target(目标类)的同相同方法。

五、编写通用的动态代理。

1,先定义一个接口

package cn.jinfulin.day3.Proxy;

import java.lang.reflect.Method;

public interface IAdvice {
	void beforMethod(Method method);
	void afterMethod(Method method);
}

2,实现这个接口

package cn.jinfulin.day3.Proxy;

import java.lang.reflect.Method;

public class MyAdvice implements IAdvice {

	long beginTime;
	@Override
	public void beforMethod(Method method) {
		beginTime = System.currentTimeMillis();
		System.out.println(method.getName() + "欢迎来学习动态代理,");
	}

	@Override
	public void afterMethod(Method method) {
		Long endTime = System.currentTimeMillis();
		System.out.println( method.getName() + "我已经学会了代理,用时" + (endTime - beginTime));
	}

}

3,编写动态代理类方法

/**
	 * 最终改写后的代理类
	 */
	private static Object finnalMethod(final Object target,final IAdvice advice) {

		Object proxy1 =  Proxy.newProxyInstance(//创建动态代理类的一个新实例
				target.getClass().getClassLoader(),//第一个参数,定义代理类的类加载器
				target.getClass().getInterfaces(), //第二个参数,代理类要实现的接口列表
				new InvocationHandler() {		  //第三个参数,指派方法调用的调用处理程序
					@Override
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {

						advice.beforMethod(method);//加上目标类的一个方法
						Object retval = method.invoke(target, args);
						advice.afterMethod(method);//在加上目标类的一个方法
						return retval;
//						return method.invoke(target, args);

					}
				});
		return proxy1;

	}

4,客户端调用

		ArrayList target = new ArrayList();
		Collection proxy = (Collection)finnalMethod(target,new MyAdvice());
		proxy.add("金福林");//使用了一次方法,就相当于调用了一次invoke方法
		proxy.clear();\\第二次调用
		System.out.println(proxy.size());\\第三次调用
		

5,结果

六、最后

代理终于也写完了,以后要靠java吃饭,java基础学好了还是很有必要的,以后的开发也是在这些知识基础上,使用框架和API等做开发。毕竟万变不离其宗,掌握基础掌握原理才能更好的使用工具。

时间: 2024-08-10 08:13:49

高新技术:代理的相关文章

黑马程序员——Java高新技术代理

代理 普通代理 很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦.代理就为其他类提供了一种控制其对象的方法.代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法. interface Solution{ public void doSomething(); } //委托类Demo实现了接口 class Dem

java高新技术-代理

程序中代理的概念与作用 要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理.等等. 代理架构图: 如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类,还是使用代理类, 这样以后很容易切换,例如:想要日志功能时就配置代理类,否则配置目标类,这样,增加系统功能很容易. 1.分析代理类的作用与原理及AOP概念 代理是实现AOP功能的核心和关键技术. 系统中存在交叉业务,一个交叉业务就是要切入到系

黑马程序员——【Java高新技术】——代理

一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理等等,如何去做? 解答:编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码. 2.代理原理图,如下: 3.代理的优点 如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类.还是代理类,这样以后很容易切换.例如,想要日志功能时就

韩施尔面膜怎么代理?韩施尔产品怎么样?韩施尔面膜好不好?

韩施尔面膜怎么代理?韩施尔产品怎么样?韩施尔面膜好不好?代理韩施尔面膜加江哥微信:CNJK360.10年百度推广引流经验,带你快速赚钱致富! 或是因为天生爱美的缘故,很多女生或多或少都在保养着自己的肌肤,最怕一个不小心就会毁了自己的脸蛋,无论是多是少,或淡或浓,雀斑始终都是美白的死对头.美白除了调整肤色之外,当然少不了要赶走色斑,虽然淡淡的雀斑代表稚气,而成熟的知性女人拒绝稚气.有人说雀斑有分天生和后天形成,但无论情况如何,只要用对了方法,就能够淡化雀斑,实现“麻雀变凤凰”. [选择祛斑产品效果

什么样的公司可以申请高新技术企业?-高企云

什么样的公司可以申请高新技术企业? 满足7个条件: 1.成立时间,1年以上; 2.申报领域:产品(服务)属于<国家重点支持的高新技术领域>规定的范围 3.人员结构:科技人员占比10%以上; 4.研发费用(近三个会计年度的研究开发费用总额占销售收入总额的比例): ①销售收入≤5000万,研发费用≥5%;②5000万<销售收入≤2亿,研发费用≥4%; ③销售收入>2亿,研发费用≥3%. 5.高品收入:60%以上 6.具有知识产权; 7.主要产品 :拥有知识产权的高新技术产品(服务)收入

黑马程序员_Java高新技术

1  JDK5的新特性 1.1 静态导入       在API中那些不需要new对象的类,可以在类文件的开头,import static java.lang.Math.*;这里把Math中的所有的静态方法都导入了,在类中不需要调用Math类就能直接用Math的方法了 package cn.wjd.staticimport; import static java.lang.Math.*; public class StaticImport { public static void main(Str

黑马程序员_高新技术_1_Java反射

------- android培训.java培训.期待与您交流! ---------- 0.反射知识体系 下图为反射整体的知识体系,把握住此图也就全局上掌握住反射所有内容. 1.反射概论 1)反射概念 其实字面上可以这么理解反射,平时使用类时都是由类new出对象,而反射则是通过对象"反射"出类的信息,好比一个人照镜子可以看到人类的特征,而看出机制就是镜子反射. 2)Java对象两种类型 Java程序中的许多对象在运行时会出现两种类型:编译时类型和运行时类型.如下代码: Person p

毕业生必须知道:干部身份、三方协议、派遣证、人事代理、户口迁移 、编制、工龄、签约、档案

学校里关于毕业生的会也已经开了一大堆,耳朵也长膙了,嘴唇也磨薄了,很多人随大流听听看看,可真正重要的一些东西相信有很大一部分人却没有搞懂.如果不 信,你可以问问自己,什么叫三方协议?三方协议和谁签?有什么用?户口和三方又有什么关系?当一个个问题逐一提出来时,你可能已经开始觉得发虚. 在这里,我想简单的说一说我目前所知道的关于这方面的一些问题,相信肯定有很多不全面的地方,但至少相信可以帮帮你. 首先是大学毕业后的人生基本规划(本处所指为非在职考研.考博.考公务员等同学): 大学毕业后的一年最为关键

AppScan代理扫描app/H5安全测试

1.首先设置AppScan代理,设置如下: 2.设置手机端代理: 3.通过外部设备调用,记录请求: 直接点击确定,即可扫描到所有的请求