salesforce零基础学习(九十八)Type浅谈
在Salesforce的世界,凡事皆Metadata。
先通过一句经常使用的代码带入一下:
Account accountItem = (Account)JSON.deserialize(accountString,Account.class);
这种代码相信大部分开发都会写过,前台将数据序列化,通过字符串的形参传递给后台,后台将数据进行反序列化,从而获取到这个表或者这个自定义类的实例。所以问题来了,为啥第二个参数是 Account.class?我们通过官方的API描述可能更好的进行了解。

这里我们引出了 Type的概念,他是apex 预定的类型,包括 基础数据类型(Integer等) , 集合, sObject类型以及 用户定义的类。基础数据类型等等都是 object类型,所以当我们理解salesforce里面的类型时,可以简单的分成两个大类:Object & sObject。所以Type概念引入完了,它用来干嘛?怎么声明?什么时候用呢?
Type t1 = Integer.class;
Type t2 = Type.forName('Integer');
system.debug(t1.equals(t2));
上面的简单的demo中提供了两种声明Type的方式,一种是根据 object | sObject使用 .class声明,另外一种是使用 Type的方法forName来实例化变量。既然变量可以声明出来,我们就可以看看他的方法考虑如何搞事情了。

Type的方法非常少,所以我们想要查看其对应的方法描述以及使用很容易就看完。这里针对几个重要的方法进行描述:
- forName(fullyQualifiedName):返回与指定的完全限定的类名相对应的类型。这里的类名包括salesforce系统预制的类,自定义的类以及sObject名称;
- isAssignableFrom(sourceType):如果object指定类型的引用可以从子类型分配,则返回true,否则返回false。这个方法我们可能首先会先想到 instanceof,因为都是来判断类型是否相兼容匹配,但是 instanceof必须是初始化这个类或者对象的变量,才能使用 instanceof 来进行判断,使用 此方法可以省去了静态编译时的依赖,所以如果想判断依赖性,可以优先考虑此方法。
- newInstance():此方法用来实例化一个指定Type的对象,返回类型是一个object对象,我们可以强制转换成我们需要的对象类型。因为apex也是面向对象的语言,封装,继承,多态三大特性,我们可以通过 newInstance实现父子类型的轻松转换调用相关的方法从而实现动态配置。
基础信息介绍完毕,此篇浅入浅出,介绍两种可能用到的场景。
1. JSON序列化与反序列化
这个我们经常使用,一笔带过:通过字符串以及指定的 Type类型可以转换成指定的数据类型。
Account accountItem = (Account)JSON.deserialize(accountString,Account.class);
2. 针对Custom Setting等根据配置的动态的类调用动态方法的使用
ParentClass是一个父类,有两个变量以及一个虚拟的方法,继承的子类可以进行实现
public abstract class ParentClass {
public String param1 { get; set; }
public String param2 { get; set; }
public ParentClass() {
this.param1 = 'value1';
this.param2 = 'value2';
}
public virtual String joinParam() {
return param1 + param2;
}
}
SonClass1继承了它并实现了它相关的方法
public class SonClass1 extends ParentClass {
public SonClass1() {
super();
this.param1 = 'son value1';
this.param2 = 'son value2';
}
public override String joinParam() {
return super.joinParam();
}
}
还有其他的SonClassn继承了它并实现了它的相关的方法,我们在custom setting中配置了不同的场景应该调用的不同的子类,公共方法中,我们只需要使用以下的代码来判断和调用即可。
public String executeJoin(String className) {
Type t = Type.forName(className);
Type t2 = Type.forName('ParentClass');
if(!t2.isAssignableFrom(t)) {
throw new CustomException('should be son class of ParentClass');
}
ParentClass newObj = (ParentClass)t.newInstance();
return newObj.joinParam();
}
总结:篇中简单的介绍了salesforce中的 Type的使用,抛砖引玉,想要深入了解还要自行查看官方文档。篇中有错误的地方欢迎指出,有不懂的欢迎留言。
salesforce零基础学习(九十八)Type浅谈的更多相关文章
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
- salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值
注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...
- salesforce零基础学习(八十四)配置篇: 自定义你的home page layout
当我们进入salesforce系统或者切换app后,默认第一个看到的就是home页面.home页面简单的来说可以包括左侧(narrow component)和右侧(wide component)两部分 ...
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
Streaming API参考链接: https://trailhead.salesforce.com/en/modules/api_basics/units/api_basics_streaming ...
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax.pdf 在项目中 ...
- salesforce lightning零基础学习(十) Aura Js 浅谈三: $A、Action、Util篇
前两篇分别介绍了Component类以及Event类,此篇将会说一下 $A , Action以及 Util. 一. Action Action类通常用于和apex后台交互,设置参数,调用后台以及对结 ...
- salesforce零基础学习(八十八)项目中的零碎知识点小总结(二)
通过做项目以及群里面的一些大神的聊天,总结一下关于项目中的两个知识点,以后当做参考. 一. 在custom setting中配置集成接口信息后刷sandbox的问题 我们做项目时,经常会遇见和其他平台 ...
- salesforce零基础学习(八十三)analytics:reportChart实现Dashboard(仪表盘)功能效果
项目中经常会用到Report以及Dashboard来分析汇总数据,Dashboard可以指定view as user,如果针对不同的用户需要显示其允许查看的数据,比如 根据role hierarch ...
随机推荐
- 决策树purity/基尼系数/信息增益 Decision Trees
目录 决策树简单描述 衡量purity的三种方法 Gini Coefficient Entropy熵 决策树简单描述 决策树的样子大概是这个样子的: 选择一个特征作为根节点,把这个特征划分成两个孩子节 ...
- Java效率工具Lombok使用与原理
Java效率工具Lombok使用与原理 我个人觉得 Lombok是一个优化Java代码以及提升开发效率不错的工具.Lombok 的Github地址为:https://github.com/rzwits ...
- MySQL创建用户,并设置指定访问数据库
一.创建用户并授权 1. 登录mysql mysql -u root -q输入密码2. 创建数据库(已有数据库就不需要建立) create database newDB;//以创建newDB为例3. ...
- 将`VuePress`建立的博客部署到GitHub或Gitee上
将VuePress建立的博客部署到GitHub或Gitee上 在上一篇中,我们详细介绍了如何利用VuePress搭建起个人博客系统,但这只是在本地debug启动的,接下来,我们把它部署到Github网 ...
- Set接口中的HashSet,LinkedHashSet,TreeSet
TestSet package com.aff.coll; import java.util.Comparator; import java.util.HashSet; import java.uti ...
- # # # Vue的分环境打包
我们使用Vue-cli的默认环境是只有dev和prod两种环境,在开发中我们的项目一般是开发版.测试版.pre版.Prod版.我们一般是在源码中API地址中修改后然后打包. ###1.首先安装cros ...
- Rocket - util - Misc
https://mp.weixin.qq.com/s/kf4FvAFye_bRdT49Yow7Hg 简单介绍Misc中各个辅助方法的用途和实现. 1. ParameterizedBu ...
- JavaScript (六) js的基本语法 - - - Math 及 Date对象、String对象、Array对象
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Math 1.Math对象的案例 var result= Math.max(10,20,30,40) ...
- Java实现 LeetCode 712 两个字符串的最小ASCII删除和(最长公共子串&&ASCII值最小)
712. 两个字符串的最小ASCII删除和 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 ...
- Java实现 LeetCode 401 二进制手表
401. 二进制手表 二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59). 每个 LED 代表一个 0 或 1,最低位在右侧. 例如,上面的二进制手表 ...