对象与类相关的工具类
| Type | Name and description |
|---|---|
static Object |
createProxy(Object target, Closure before, Closure after)创建一个动态代理对象 |
static Object |
deserialize(byte[] so)将 byte[] 反序列化为对象 |
static boolean |
equals(Object bean1, Object bean2, boolean compareMap = false, List<String> includes = null)判断两个 Domain 实例是否相等。 |
static Class |
findChildClass(Object bean, grails.core.GrailsDomainClass domainClass, String childClass, String childProperty) |
static Class |
findController(String controllerName)根据控制器名称(如 hrAskForLeaveProcess),获得控制器类 |
static Class |
findControllerByDomain(String className)根据 Domain 类名称获得其对应的脚手架控制器类 |
static String |
findControllerNameByDomain(String className)根据 Domain 类名称获得其对应的控制器名称(如 hrAskForLeaveProcess) |
static List<String> |
findControllerNamesByDomain(String className)根据 Domain 类名称获得其对应的控制器名称(如 hrAskForLeaveProcess)列表 |
static List<Class> |
findControllersByDomain(String className)根据 Domain 类名称获得其对应的脚手架控制器类列表 |
static Class |
findDomainByController(String controllerName)根据控制器名称(如 hrAskForLeaveProcess)获得其对应的 Domain 类 |
static Class |
findDomainByController(Class controllerClass) |
static String |
findProperty(Object bean, Class clazz, Map options = null)根据类型和关联关系寻找属性 |
static String |
fixClassName(String className) |
static A |
getAnnotation(Class clazz, Class<A> annotationClass)或得类(含父类)上的注解对象 |
static Object |
getBean(String beanName)获得 Spring Bean |
static T |
getBean(Class<T> beanClass)获得 Spring Bean |
static List<String> |
getBeanDefinitionNames()获得系统中所有的 Spring Bean 的名称 |
static Map<String, Class> |
getBelongsTo(Class clazz)获得 Domain 类的所有父类属性 |
static Set<String> |
getControllerActions(String controllerName)根据控制器名称(如 hrAskForLeaveProcess),获得所有操作方法,如 list、save 等 |
static reflect.Field |
getField(Class clazz, String name)根据名称获得类(含父类)的公共 Field 对象,以便执行一些反射操作 |
static Closure |
getGroupUniqueValidator(String propertyName, List uniques = null)用于 Domain 多属性唯一性校验的校验器 |
static MetaClass |
getMetaClass(Object obj)获得对象的 metaClass 对象 |
static Map<String, Map> |
getPersistentProperties(Class clazz, boolean cachable = true)获得 Domain 类的所有可持久化的属性信息,包括名称、类型、是否引用其他 Domain 类、是否 hasMany 等 |
static Map<String, Map> |
getPersistentProperties(org.grails.datastore.mapping.model.PersistentEntity persistentEntity, Map options)@param options.cachable 是否缓存结果 |
static Object |
getProperty(Object obj, String name)获得对象的属性值(甚至 protected 的属性);如果属性不存在则抛出异常。 |
static Object |
getProperty(Object obj, String name, Object defaultVal)获得对象的属性值;属性不存在则返回默认值,而不是抛出 MissingPropertyException 的异常。 |
static Object |
getProperty(Object obj, List<String> names)获得对象的属性值;如果属性不存在则抛出异常。 |
static Object |
getProperty(Object obj, List<String> names, Object defaultVal)获得对象的属性值;属性不存在则返回默认值,而不是抛出 MissingPropertyException 的异常。 |
static Class |
getTemplateClass(Class clazz, int index = 0)获得泛型的类型实例 |
static Class |
getTemplateDomainClass(Class<grails.artefact.Controller> clazz) |
static boolean |
hasAnnotation(Class clazz, Class<? extends annotation.Annotation> annotationClass)判断类(含父类)是否有注解 |
static boolean |
hasMethod(Object obj, String methodName, Class[] paramTypes = null)根据名称判断方法是否存在 |
static String |
hasProperty(Object obj, Object props)判断是否有某属性或成员变量 |
static boolean |
hasStaticProperty(Class clazz, String name) |
static boolean |
instanceOf(Object bean, Class clazz)判断对象是否是某个 Domain 类。 |
static boolean |
isDomain(Object obj)判断是否为 Domain 类 |
static boolean |
isPersistentProperty(Class clazz, String name)判断 Domain 类的属性是否是可持久化的 |
static Class |
loadClass(String className)根据类名,获得类 |
static Class |
parseClass(String script)根据源码,生成 Class |
static T |
registerBean(String name, Class<T> clazz, Map props, boolean overwrite = false)注册一个 Spring Bean,类似 resources.groovy 或插件 doWithSpring 方法中的配置,不过是运行时动态注册。 |
static void |
registerHibernateListner(Object obj, List<String> events, org.hibernate.SessionFactory sessionFactory = null)动态注册 Hibernate 事件监听器 |
static void |
registerHibernateListner(Object obj, String event, org.hibernate.SessionFactory sessionFactory = null)动态注册 HibernateListner |
static byte[] |
serialize(java.io.Serializable obj)将对象序列化成 byte[] |
static void |
setProperties(Object obj, Map props, List<String> propNames)根据名称设置对象的多个属性值 |
static void |
setProperty(Object obj, String name, Object value)设置对象的属性值;属性不存在则抛出异常。 |
static void |
updateDynamicTable(Object bean, Class hasManyClass, String hasManyName, String belongsToName, Map params, String paramsPrefix, String requiredField, Map callbacks = null)保存/更新提交的某张动态表的数据。 |
static void |
updateDynamicTables(Object bean, Map params, Map callbacks = null)自动保存/更新提交的所有动态表的数据。 |
static String |
updateFullIds(Object bean, String fullidsProp, String parentProp, String childrenProp)根据上下级关系,更新全 ID,如 “;1;2;3;” |
static String |
updateFullIds(Object bean) |
static String |
updateFullNames(Object bean, String nameProp, String fullnameProp, String parentProp, String childrenProp, String splitter, boolean hasFirstSplitter, String prefix = null)根据上下级关系,更新全名(如 fullName,包括下级节点),每级之间以 splitter 分隔 |
static String |
updateFullNames(Object bean) |
static String |
updateFullSequences(Object bean, String seqProp, String fullseqProp, String parentProp, String childrenProp, Integer maxLevel = 10, Integer seqLen = 3, String prefix = null)根据本级内排序号,更新全局序号 |
static String |
updateFullSortorders(Object bean, String seqProp, String fullseqProp, String parentProp, String childrenProp, Integer maxLevel = 10) |
static Number |
updateLevels(Object bean, String levelProp, String parentProp, String childrenProp, Number start = 1)根据上下级关系,更新级别(如 level,包括下级节点) |
static Number |
updateLevels(Map options)根据上下级关系,更新级别(如 level,包括下级节点) |
| Methods inherited from class | Name |
|---|---|
class Object |
Object#wait(long, int), Object#wait(long), Object#wait(), Object#equals(Object), Object#toString(), Object#hashCode(), Object#getClass(), Object#notify(), Object#notifyAll() |
创建一个动态代理对象
可以用来计算方法执行时间、覆盖原对象或者类的方法等功能。
例如:createProxy(object, {m,p-> println m}, {m,p,r -> println r})
如果都是 groovy 类,更简单的还可以参考 http://groovy.codehaus.org/ExpandoMetaClass+-+Runtime+Discovery 中的方式来覆盖类或者对象的方法。 此外,由于 Groovy、Grails 本身有大量动态方法,因此可能调用代理对象的方法时,可能会抛出 MissingMethodException 的异常。
before - 包含参数String methodName, Object[] args的闭包,在执行原对象方法前被调用,如果返回 false,则中断执行after - 包含参数String methodName, Object[] args, Object result的闭包,在执行原对象方法后被调用,参数 result 为原方法的返回结果将 byte[] 反序列化为对象
判断两个 Domain 实例是否相等。
作为默认的 equals 方法,自动或由注解 bropen.toolkit.annotation.DomainEquals 注入到Domain类中。 可解决延迟加载后,bean 的类名自动加上后缀 "_$$...." 问题。
compareMap - 是否允许和 Map 进行比较,默认为否includes - 参与 equals 计算的属性名列表,默认为 id根据控制器名称(如 hrAskForLeaveProcess),获得控制器类
根据 Domain 类名称获得其对应的脚手架控制器类
根据 Domain 类名称获得其对应的控制器名称(如 hrAskForLeaveProcess)
根据 Domain 类名称获得其对应的控制器名称(如 hrAskForLeaveProcess)列表
根据 Domain 类名称获得其对应的脚手架控制器类列表
根据控制器名称(如 hrAskForLeaveProcess)获得其对应的 Domain 类
按照控制器泛型、静态属性 _scaffold、scaffold、c1 的顺序搜索。
根据类型和关联关系寻找属性
bean - Domain实例clazz - 属性类型options - bean 和属性的关联关系,包含 oneToOne、oneToMany、hasOne、manyToMany、manyToOne 等关系;
默认为 [oneToOne: true, oneToMany: true]。或得类(含父类)上的注解对象
获得 Spring Bean
获得 Spring Bean
获得系统中所有的 Spring Bean 的名称
获得 Domain 类的所有父类属性
根据控制器名称(如 hrAskForLeaveProcess),获得所有操作方法,如 list、save 等
根据名称获得类(含父类)的公共 Field 对象,以便执行一些反射操作
用于 Domain 多属性唯一性校验的校验器
示例:
name(nullable: false, blank: false, unique: ['code', 'measure'],
validator: bropen.toolkit.utils.grails.BeanUtils.getGroupUniqueValidator('name'))
示例2:
name(nullable: false, blank: false,
validator: bropen.toolkit.utils.grails.BeanUtils.getGroupUniqueValidator('name', ['code', 'measure']))uniques - 需要关联的唯一属性集合,想使用父类中的字段作为唯一属性时,可以使用此参数,用法参考示例2 ,默认 nullpropertyName - 配置校验器的属性名称,通过它可以获得关联的唯一属性获得对象的 metaClass 对象
主要用于一些静态编译的方法或 java 代码中。
获得 Domain 类的所有可持久化的属性信息,包括名称、类型、是否引用其他 Domain 类、是否 hasMany 等
[name: x, type: y/Set/List..., reftype: x, isDomain: bool, hasMany: bool, unique: bool, nullable: bool]
options.cachable - 是否缓存结果options.constraints - 是否通过类的 constraints 属性计算 unique、nullable 等配置获得对象的属性值(甚至 protected 的属性);如果属性不存在则抛出异常。
获得对象的属性值;属性不存在则返回默认值,而不是抛出 MissingPropertyException 的异常。
获得对象的属性值;如果属性不存在则抛出异常。
names - 级联查询的属性名称列表,如查询对象 foo.a.b.c,则 names 为 ['a', 'b', 'c']获得对象的属性值;属性不存在则返回默认值,而不是抛出 MissingPropertyException 的异常。
names - 级联查询的属性名称列表,如查询对象 foo.a.b.c,则 names 为 ['a', 'b', 'c']获得泛型的类型实例
判断类(含父类)是否有注解
根据名称判断方法是否存在
obj - 对象实例,或者类methodName - 方法名称,这里不区分静态方法、私有方法paramTypes - 方法参数类型,如果为 null,则仅通过方法名称进行判断判断是否有某属性或成员变量
注意这里不判断属性或成员变量是否是静态的,因此使用时需谨慎。
obj - 对象实例,或者类props - 属性名称或属性名称列表判断对象是否是某个 Domain 类。
主要是解决延迟加载后,bean 的类名自动加上后缀 "_$$...." 问题。
判断是否为 Domain 类
obj - 如果是 Class,则判断类是不是领域类;如果是对象,则判断对象的类;如果是列表或数组,则判断其中的第一个元素是否是领域类。判断 Domain 类的属性是否是可持久化的
clazz - Domain 类name - 属性名根据类名,获得类
根据源码,生成 Class
script - 源代码注册一个 Spring Bean,类似 resources.groovy 或插件 doWithSpring 方法中的配置,不过是运行时动态注册。
注:Spring Bean 原本有多种作用域,如 singleton、prototype(即non-singleton)等等,这里仅注册常用的单例 Bean。
name - Bean的名称clazz - Bean的类props - 初始化时需要注入的参数Map(类里需要实现对应的setXxxx方法);null则表示无需注入其他参数overwrite - 如果Bean已存在,是否覆盖,默认为否(等同于getBean)动态注册 Hibernate 事件监听器
obj - 监听类或监听类实例events - 需要监听的事件列表sessionFactory -
如果为空,则注册到所有数据源上。
在调用方,可以通过: DbUtils.getSessionFactory 获得sessionFactory,或者直接依赖注入。动态注册 HibernateListner
obj - 监听类或监听类实例event - 需要监听的事件将对象序列化成 byte[]
根据名称设置对象的多个属性值
propNames - 需要设置的属性名称,如果 props 中不存在,则不设置设置对象的属性值;属性不存在则抛出异常。
保存/更新提交的某张动态表的数据。配合 Web 端 js 工具类 “DynamicTable”。
hasManyClass - 明细项的 Domain ClasshasManyName - 容器的列表属性名称(hasMany)belongsToName - 明细项对应容器的属性名称(belongsTo),如果为 null,则可能是采用中间表关联的、松耦合的 hasMany 关系params -
控制器里的params。
如果 params[prefix].preserved 有值(以分号或逗号分隔的多个 ID 字符串),且提交的数据里不包含这些数据,则不会自动删除;
如果 params[prefix+"DynamicTable"] 为空,则什么都不做,前台使用 js api 初始化动态表格时,会自动提交该值;
如果 params[prefix] 为空,会删除所有数据。paramsPrefix - 参数前缀,如 mxAnzhuangItem、item 等,注意不能为下划线开头(如_item),并且建议不要和 hasManyName 一致,以免调用 bean.properties = params 时把值全部冲掉requiredField - 必填项的名称,如 name,如果值为空,则会这条数据不会被保存自动保存/更新提交的所有动态表的数据。配合 Web 组件 DynamicTable。
params - 提交的数据,一般就是控制器里的 paramscallbacks.delete - 回调方法 {item-> XXXX},如果方法返回false,则不删除。本参数可以直接传一个false值,相当于一个返回false的方法callbacks.save - 回调方法 {item-> XXXX}*callbacks.update - 回调方法 {item, Map oldProps=null -> XXXX},如果不许要知道原始的属性,则该闭包无需参数2,以提高性能callbacks.bind - 回调方法 {key, value -> return value2},用于转换前台提交过来的数据,如果返回null,则表示不处理(自动bind)根据上下级关系,更新全 ID,如 “;1;2;3;”
bean - 需要更新的实体fullidsProp - 全 ID 属性名,如 fullIdsparentProp - 上级 bean 的属性名称,如 parentchildrenProp - 下级 bean 的属性名称,如 children根据上下级关系,更新全名(如 fullName,包括下级节点),每级之间以 splitter 分隔
bean - 需要更新的实体nameProp - 名称属性名,如 namefullnameProp - 全名属性名,如 fullNameparentProp - 上级 bean 的属性名称,如 parentchildrenProp - 下级 bean 的属性名称,如 childrensplitter - 分隔符,如 /hasFirstSplitter - 如果没有上级节点,是否以分隔符作为开始字符prefix - 全名前缀根据本级内排序号,更新全局序号
bean - 需要更新的实体seqProp - 序号属性名称,如 sequence,必须为 1~999..,长度不超过 seqLenfullseqProp - 全局序号属性名称,如 fullSequenceparentProp - 上级bean的属性名称,如 parentchildrenProp - 下级bean的属性名称,如 children,如果为空,则不更新下级节点maxLevel - 最大的级别(级别越高,全局序号越长),默认为10级seqLen - 序号属性的长度,默认为 3prefix - 全局序号前缀根据上下级关系,更新级别(如 level,包括下级节点)
bean - 需要更新的实体levelProp - 级别属性名,如 levelparentProp - 上级bean的属性名称,如 parentchildrenProp - 下级bean的属性名称,如 childrenstart - 根节点的级别,默认为 1根据上下级关系,更新级别(如 level,包括下级节点)
options.bean - 需要更新的实体options.level - 级别属性名,默认为 leveloptions.parent - 上级bean的属性名称,默认为 parentoptions.children - 下级bean的属性名称,默认为 childrenoptions.start - 根节点的级别,默认为 1;如果有值,则更新 bean 的级别为 start,所有下级对象的级别均基于上级节点的级别加1。options.offset - 级别的修正偏移量;start 没有值的时候有效;将 bean 和所有下级对象的级别加上偏移。options.stopper - 可接收当前递归的实体对象为参数的闭包停止器,返回 true 时停止更新当前实体及下级节点。