JAVA的动态代理,在MYBATIS中应用的很广,其核心就是写一个interface,但不写实现类,然后用动态代理来实例化并执行这个interface中的方法,话不多说,来看一个实现的例子:

1.先定义一个接口:

public interface TestProxy {

	String hello();

}

2.虽然不写实现类,但我们仍然希望在执行这个hello()方法时,能输出我们想要输出的内容,比如我把希望要输出的内容放在一个属性文件中:

hello=world

我希望在调用hello方法时,输出world,接下来得解析这个属性文件:

public class PropertiesHandler {

	private static Properties p = new Properties();

	static{
try {
InputStream in = new FileInputStream(new File("src/test.properties"));
p.load(in);
in.close();
} catch (IOException e) {
throw new RuntimeException("test.properties load error!");
}
} public static String getProperty(String key){
try{
return p.getProperty(key, null);
}catch(Exception e){
e.printStackTrace();
}
return "";
} }

3.解析完后,我们再写一个动态代理类:

public class ProxyImp<T> implements InvocationHandler{

	private Class<T> proxyMethod;

	public ProxyImp(Class<T> proxyMethod) {
this.proxyMethod = proxyMethod;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
String value = PropertiesHandler.getProperty(method.getName());
System.out.println(value);
return null;
} }

其原理就是在调用接口类方法时,动态代理类都会去执行这个invoke方法,以达到执行的目的,可以看到,在invoke方法里,我们把hello方法在属性文件中对应的值给取出来了,并输出。

4.接下来就是再封装一个代理工厂类来产生这个接口的一个实例:

public class ProxyImpFactory{

	@SuppressWarnings("unchecked")
public static <T> T newInstance(Class<T> methodInterface) {
final ProxyImp<T> proxyImp = new ProxyImp<T>(methodInterface);
return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
new Class[]{methodInterface},
proxyImp);
} }

可以从上面的代码中看出这个代理类会自动的生成一个接口实现类的实例。

5.接下来就是真正的调用了:

	public static void main(String[] args) {
TestProxy tp = ProxyImpFactory.newInstance(TestProxy.class);
tp.hello();
}

输出就是:world.

6.动态代理在自动化中的作用:

 自动化中,当把元素对象用外部文件,把数据文件用外部文件时,都可以用这种方式来进行封装,其在自动化测试中最大的作用,我想就是利用在封装关键字上了,把关键字与具体的方法对应起来,就可以用这样的方式。

 至于具体的关键字的实现,我想得靠大家自已了,有兴趣的可以与我讨论!

JAVA的Proxy动态代理在自动化测试中的应用的更多相关文章

  1. Java进阶 | Proxy动态代理机制详解

    一.Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就被转换成字节代码.c ...

  2. Java设计模式—Proxy动态代理模式

    代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...

  3. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  4. java 笔记(3) —— 动态代理,静态代理,cglib代理

    0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...

  5. java学习之动态代理模式

    package com.gh.dynaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Metho ...

  6. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  7. Java学习笔记--动态代理

    动态代理 1.JDK动态代理 JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy ...

  8. Java 反射之动态代理

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt205 利用Java反射机制你可以在运行期动态的创建接口的实现.java.la ...

  9. 杨晓峰-Java核心技术-6 动态代理 反射 MD

    目录 第6讲 | 动态代理是基于什么原理? 典型回答 考点分析 知识扩展 反射机制及其演进 动态代理 精选留言 Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAnd ...

随机推荐

  1. css3之转换

    1.2D转换 2.3D转换 transform-style属性(设置三维/二维效果) 值: flat表示子元素不保留3D设置(默认) preserve-3d表示子元素保留3D设置 transform属 ...

  2. Problem 2136 取糖果---FUOJ (线段树+维护)

    http://acm.fzu.edu.cn/problem.php?pid=2136 题目大意: 给你n个袋子每个袋子里都装有糖果,然后呢你可以每次抽取一个连续的一个区间的袋子,然后带走里面最多糖果数 ...

  3. centos 安装flash插件

    方法一: 1.选择合适的yum源http://get.adobe.com/cn/flashplayer/进入此网址选择 “YUM,适用于Linux(YUM)”,下载adobe源http://101.9 ...

  4. [ASE][Daily Scrum]11.26

    今天主要是修复一些历史遗留问题以及bug, 在task上进展不是很明显, 在地图与客户端同步之后产生了一些bug,例如一发子弹会消掉很多砖块,服务器地图与本地地图不同步等等... 目前的大方向分工是这 ...

  5. java获取classpath文件路径空格转变成了转义字符%20的问题

    java获取classpath文件路径空格转变成了转义字符%20的问题 这个问题很纠结,服务器的文件路径带有空格,空格被转化是%20了,悲剧就出现了 下面展示一段代码String path = get ...

  6. 使用本地服务器组来管理局域网或公网上的SQLSERVER

    使用本地服务器组来管理局域网或公网上的SQLSERVER 测试的两台机器 Windows7 64位   SQLSERVER2005 SP5 Windows7 64位   SQLSERVER2012 S ...

  7. Sublimetext (for windows)编译运行c出现Error 2错误的解决办法

      错误描述大概如下: [Error 2]  [cmd:  [u'bash', u'-c', u"g++ 'D:\\codeblocks\\project\\test.c' -o 'D:\\ ...

  8. 无线客户端框架设计(5):调用MobileAPI的设计(iOS篇)

    这一节讲如何发起网络请求. iOS用于调用MobileAPI的第三方组件很多,我们这里采用的是以下组件: 1)ASIHTTPRequest,用于请求MobileAPI:http://allseeing ...

  9. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  10. HTML+CSS小实战案例

    HTML+CSS小实战案例 登录界面的美化,综合最近所学进行练习 网页设计先布局,搭建好大框架,然后进行填充,完成页面布局 <html> <head> <meta htt ...