在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浅谈的更多相关文章

  1. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

  2. salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现

    项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...

  3. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  4. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  5. salesforce零基础学习(八十四)配置篇: 自定义你的home page layout

    当我们进入salesforce系统或者切换app后,默认第一个看到的就是home页面.home页面简单的来说可以包括左侧(narrow component)和右侧(wide component)两部分 ...

  6. salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)

    Streaming API参考链接: https://trailhead.salesforce.com/en/modules/api_basics/units/api_basics_streaming ...

  7. salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)

    Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax.pdf 在项目中 ...

  8. salesforce lightning零基础学习(十) Aura Js 浅谈三: $A、Action、Util篇

    前两篇分别介绍了Component类以及Event类,此篇将会说一下 $A , Action以及 Util.  一. Action Action类通常用于和apex后台交互,设置参数,调用后台以及对结 ...

  9. salesforce零基础学习(八十八)项目中的零碎知识点小总结(二)

    通过做项目以及群里面的一些大神的聊天,总结一下关于项目中的两个知识点,以后当做参考. 一. 在custom setting中配置集成接口信息后刷sandbox的问题 我们做项目时,经常会遇见和其他平台 ...

  10. salesforce零基础学习(八十三)analytics:reportChart实现Dashboard(仪表盘)功能效果

    项目中经常会用到Report以及Dashboard来分析汇总数据,Dashboard可以指定view as user,如果针对不同的用户需要显示其允许查看的数据,比如  根据role hierarch ...

随机推荐

  1. SecureCRT 简单运用

    1.想要从本地电脑将文件通过secureCRT传输到远程服务器如下目录 2.在SecureCRT界面中使用快捷键[Alt+P] 打开了SFTP的界面 3.找到你要传的文件的地址[E:\a.zip] 4 ...

  2. Java——Json字符串与Object互转

    public static void JacksonTest() {//推荐 //{"MNG001":[{"ID":"1","PW ...

  3. web自动化之浏览器的窗口切换

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  4. 读Pyqt4教程,带你入门Pyqt4 _004

    在PyQt4教程的这部分中,我们将探讨应用中事件和信号的发生. 事件是GUI程序的重要部分,由用户或者系统产生.当我们调用应用的 exec_() 方法,应用进入主循环.主循环获取事件并把它们发往对象. ...

  5. 微软:悬赏10万美金破解 Linux 系统

    微软选择了 Linux 系统作为物联网平台,并且悬赏10万美金邀请黑客来进行破解. 当然,该悬赏计划不是针对所有的 Linux 系统,而是特别针对微软的物联网端对端安全平台Azure Sphere.本 ...

  6. PHP生成指定范围的日期

    /** * 生成指定范围的日期 * * @param $string $startDate 开始日期 2020-01-01 * @param $string $endDate 结束日期 2020-01 ...

  7. leetcode56之合并区间

    题目描述: 给出一个区间的集合,请合并所有重叠的区间. 示例: 输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1, ...

  8. docker出现相同的image条目的删除办法

    一.问题:在测试docker安装的prometheus系统时,由于异常操作,使用docker image ls出现了两条一模一样的条目,如下: [root@ELK prometheus]# docke ...

  9. 【Checkpoint】HA模式下结合zookeeper说一下checkpoint流程

    checkpoint过程 配置了HA的HDFS中,有active和standby namenode两个namenode节点.他们的内存中保存了一样的集群元数据信息,这个后续我会详细用一篇文章介绍HA, ...

  10. webpack+vue2.0项目 (二)热加载,vue-router

    目录创建好之后,命令行输入 npm run dev 因为在配置文件config/index.js里: dev: { env: require('./dev.env'), port: 8080, aut ...