源代码如下:

package com.sap.crm.ui.core.pages;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import com.sap.crm.ui.core.tags.ContainerElement;
import com.sap.crm.ui.core.tags.Element;
import com.sap.crm.ui.core.tags.ElementFactory;
import com.sap.crm.ui.core.tags.ParentElement;
import com.sap.crm.ui.core.tags.SubFactory;
import com.sap.crm.ui.core.tags.UISession;public class AbstractPage {protected final UISession session;protected ParentElement container;public AbstractPage(final UISession session) {super();this.session = session;init();}protected void init() {final List<Field> fields = new ArrayList<Field>();final List<Field> subFields = new ArrayList<Field>();Map<Class<? extends SubObject>, Map<String, SubFactory<? extends SubObject>>> subFactories = new HashMap<>();Page pageAnnotation = this.getClass().getAnnotation(Page.class);Location defaultLocation = null;if (pageAnnotation != null) {defaultLocation = pageAnnotation.defaultLocation();}// Retrieve all fields/members that are declared as// public/protected/private.for (final Field field : this.getClass().getDeclaredFields()) {if (!field.isAccessible())field.setAccessible(true);final Class<?> type = field.getType();if (Element.class.isAssignableFrom(type) || type == String.class) {if (field.getAnnotation(Container.class) != null) {fields.add(0, field);} else {fields.add(field);}} else if (AbstractPage.class.isAssignableFrom(type)) {// element is inheriting from AbstractPagecreateSubPage(field, type);} else if (SubObject.class.isAssignableFrom(type)) {// subFactory e.g. for table columnssubFields.add(field);}}// Now consider all fields that have a PageElement annotation and create// the concrete element instances via factoryfor (final Field field : fields) {PageElement pageElement = resolveAnnotations(field);if (pageElement != null) {final Class<?> type = field.getType();if (type == String.class) {// Just a versioned IDsetField(field, pageElement.id());continue;}// Determine element type@SuppressWarnings("unchecked")Class<? extends Element> fieldType = (Class<? extends Element>) type;if (pageElement.type() != Element.class) {if (!fieldType.isAssignableFrom(pageElement.type())) {throw new IllegalArgumentException();}fieldType = pageElement.type();}// Get factory dependent from locationElement element;ElementFactory factory = null;factory = resolveLocation(factory, pageElement, defaultLocation);// Check if proxy neededif (ElementFactory.isConcreteType(fieldType)) {// Concrete type is known, no proxy neededelement = factory.element(fieldType, pageElement.id());} else {// Final Type is not known, need a proxyelement = factory.proxy(pageElement.id());}if (field.getAnnotation(Container.class) != null) {container = (ContainerElement) element;}setField(field, element);// Remember subFactoriesif (SubFactory.class.isAssignableFrom(fieldType)) {registerSubFactory(subFactories, field, fieldType, element);}}}// Instantiate subObject fields from factoriesfor (Field subField : subFields) {PageElement pageElement = resolveAnnotations(subField);// Get factoryMap<String, SubFactory<? extends SubObject>> subFactoriesForType = subFactories.get(subField.getType());if (subFactoriesForType == null) {throw new IllegalArgumentException("Subfactory for type "+ subField.getType() + " could not be found on page");}SubFactory<? extends SubObject> subFactory = subFactoriesForType.get(pageElement.subFactoryName());if (subFactory == null) {throw new IllegalArgumentException("Subfactory for type "+ subField.getType() + " with name "+ pageElement.subFactoryName()+ " could not be found on page");}// Get parametrization for generic typesParameterizedType genericType = (ParameterizedType) subField.getGenericType();Type[] actualTypeArguments = genericType.getActualTypeArguments();// Produce and assignObject subObject = subFactory.produce(pageElement.id(),actualTypeArguments);try {subField.set(this, subObject);} catch (final IllegalAccessException e) {throw new IllegalStateException(e);}}}private void setField(final Field field, Object value) {try {field.set(this, value);} catch (final IllegalAccessException e) {throw new IllegalStateException(e);}}private void createSubPage(final Field field, final Class<?> type) {@SuppressWarnings("unchecked")final Class<? extends AbstractPage> pageType = (Class<AbstractPage>) type;// Create sub pagestry {final Constructor<? extends AbstractPage> constructor = pageType.getConstructor(UISession.class);try {final AbstractPage page = constructor.newInstance(session);field.set(this, page);} catch (final IllegalArgumentException e) {e.printStackTrace();} catch (final InstantiationException e) {e.printStackTrace();} catch (final IllegalAccessException e) {e.printStackTrace();} catch (final InvocationTargetException e) {e.printStackTrace();}} catch (final NoSuchMethodException e) {// Ignore it, has to be coded manually}}private ElementFactory resolveLocation(ElementFactory factory,PageElement pageElement, Location defaultLocation) {Location location = pageElement.location();if (location == Location.DEFAULT && defaultLocation != null) {location = defaultLocation;}switch (location) {case ROOT:factory = session.ui();break;case CONTAINER:factory = container.contained();break;case DEFAULT:if (container != null) {factory = container.contained();} else {factory = session.workArea();}break;case TOOLBAR:factory = session.getToolbarFactory();break;case WORK_AREA:factory = session.workArea();break;}return factory;}private void registerSubFactory(Map<Class<? extends SubObject>, Map<String, SubFactory<? extends SubObject>>> subFactories,final Field field, Class<? extends Element> fieldType,Element element) {@SuppressWarnings("unchecked")SubFactory<? extends SubObject> subFactory = (SubFactory<? extends SubObject>) element;// Determine Namecom.sap.crm.ui.core.pages.SubFactory annotation = field.getAnnotation(com.sap.crm.ui.core.pages.SubFactory.class);String subFactoryName = (annotation != null) ? annotation.name() : "";Class<? extends SubObject> targetType = findSubObjectFactoryTargetType(fieldType);Map<String, SubFactory<? extends SubObject>> subFactoriesForType = subFactories.get(targetType);if (subFactoriesForType == null) {subFactoriesForType = new HashMap<>();subFactories.put(targetType, subFactoriesForType);}if (subFactoriesForType.put(subFactoryName, subFactory) != null) {throw new IllegalStateException("Ambiguous subObjectFactories on page for type "+ targetType + " with name " + subFactoryName);}}@SuppressWarnings("unchecked")private Class<? extends SubObject> findSubObjectFactoryTargetType(Class<? extends Element> fieldType) {Type[] genericInterfaces = fieldType.getGenericInterfaces();for (Type intf : genericInterfaces) {if (intf instanceof ParameterizedType&& ((ParameterizedType) intf).getRawType() == SubFactory.class) {Type[] actualTypeArguments = ((ParameterizedType) intf).getActualTypeArguments();Type type = actualTypeArguments[0];Class<? extends SubObject> targetType;if (type instanceof ParameterizedType) {targetType = (Class<? extends SubObject>) ((ParameterizedType) type).getRawType();} else {targetType = (Class<? extends SubObject>) type;}return targetType;}}throw new IllegalArgumentException();}private PageElement resolveAnnotations(final Field field) {// Fetch annotationsfinal Versioned versionedAnnotation = field.getAnnotation(Versioned.class);PageElement pageElement = field.getAnnotation(PageElement.class);// Process versionsif (versionedAnnotation != null) {int highestVersion = 0;for (final Version version : versionedAnnotation.versions()) {if (version.majorVersion() >= session.getMajorVersion()&& version.majorVersion() > highestVersion) {pageElement = version.element();highestVersion = version.majorVersion();}}}return pageElement;}
}

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

Java反射机制在UI自动化测试中的一个应用相关推荐

  1. Java反射机制demo(四)—获取一个类的父类和实现的接口

    2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...

  2. java反射机制是什么_java中的反射机制是什么?

    java中的反射机制是什么? 发布时间:2020-05-21 22:45:50 来源:亿速云 阅读:156 作者:鸽子 java:"一切即对象",感觉java语言本身在不断践行着这 ...

  3. java初反射_初始 java 反射机制 (一)

    反射机制详解 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为j ...

  4. Java反射机制--笔记

    1.认识Class类 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式. 1 /*java 反射机制*/ 2 // 获取类的方法 3 UserDao userDao = new Use ...

  5. 什么是Java反射机制?

    什么是Java反射机制? JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功 ...

  6. Java反射机制和动态代理实例

    反射机制是Java语言的一个重要特性,允许用户动态获取类的信息和动态调用对象的方法. 通过给定类的名字,通过反射机制就可以获取类的所有信息. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...

  7. java 反射 Gc_深入浅析Java反射机制

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  8. Class对象和Java反射机制

    一 前言 很多书上都说,在java的世界里,一切皆对象.其实从某种意义上说,在java中有两种对象:实例对象和Class对象.实例对象就是我们平常定义的一个类的实例: 1 2 3 4 5 6 /** ...

  9. Java反射机制浅析

    概述: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java ...

最新文章

  1. php和python哪个工资高-python工资高还是java?
  2. unicode_literals导致的UnicodeEncodeError
  3. 隐藏频道_《TED频道》-隐藏真实自我
  4. py文件转exe时包含paramiko模块出错解决方法
  5. 如何提高生产力(四)、兼职为什么很难操作?
  6. python 图像走势预测_在keras中对单一输入图像进行预测并返回预测结果操作
  7. Linux下的Notepad++编辑器——Notepadqq
  8. linux中运行环境变量,linux下的环境变量详解
  9. 最新的python是哪个版本的好_书声琅琅:Python哪个版本好用
  10. 汽车故障码(P C B U)格式解析
  11. 腾讯内部转岗_重点扶植微视,火锅视频项目裁撤?腾讯澄清:团队已并入腾讯视频...
  12. 华为内容安全反病毒总结
  13. 非转基因保护品种覆盖南北 北方旱作国稻种芯-517功能苦瓜稻
  14. 你真的了解活跃用户吗?
  15. 全球屏占比最高!华为MatePad Pro震撼发布
  16. 51单片机之蜂鸣器弹钢琴
  17. 港科夜闻|全国政协副主席梁振英先生率香港商企及机构代表一行到莅临香港科大(广州)访问交流...
  18. template波浪线
  19. Modbus 的RTU、ASCII、TCP傻傻搞不清楚?一文最全解读
  20. C4D 21版 安装好一打开就闪退,查了好久

热门文章

  1. 《Programming WPF》学习(二)Application及其设置
  2. 文献记录(part30)--DCR Disentangled component representation for sketch generation
  3. 高等数理统计(part5)--分布族的完备性
  4. 期货与期权(part4)--互换
  5. Django(part15)--页面跳转
  6. 发现 postman 自动生成接口调用代码的一个问题
  7. SAP Spartacus lazy load module 里包含了被其他 Component 静态引用的组件该怎么办
  8. Linux 主要的发行系统版本介绍
  9. SAP Fiori Service Modeler
  10. Chrome 浏览器扩展 - Dark Web - Dark Theme for Chrome