在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. 项目中 SimpleDateFormat 的正确使用

    项目中 SimpleDateFormat 的正确使用 日常开发中,我们经常需要使用时间相关类,说到时间相关类,想必大家对 SimpleDateFormat 并不陌生.主要是用它进行时间的格式化输出和解 ...

  2. MyBatis—— org.apache.ibatis.binding.BindingException: Type interface com.web.mybatis.i.PersonMapper is not known to the MapperRegistry.

    报错信息: Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interfac ...

  3. StreamSets使用指南

    StreamSets使用指南 最近在调研Streamsets,照猫画虎做了几个最简单的Demo鉴于网络上相关资料非常少,做个记录. 1.简介 Streamsets是一款大数据实时采集和ETL工具,可以 ...

  4. 什么,容器太多操作不过来?我选择Docker Compose梭哈

    接上一篇:面试官:你说你精通 Docker,那你来详细说说 Dockerfile 吧 一.容器之间通信 1.单向通信 1.1.什么意思 mysql和tomcat是两个独立的容器,但是tomcat需要和 ...

  5. 【JavaScript数据结构系列】01-数组Array

    [JavaScript数据结构系列]01-数组Array 码路工人 CoderMonkey 转载请注明作者与出处 # [JavaScript数据结构系列] # 01-数组Array 数组: 是有序的元 ...

  6. Springboot 内置tomcat 基本配置收集整理

    配置一: server:# tomcat 配置  tomcat:    # 接收队列长度    accept-count: 1000    # 最小空闲线程数    min-spare-threads ...

  7. JAVA WEB EL表达式注入

    看猪猪侠以前的洞,顺便总结下: 一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的we ...

  8. Spring AMQP:RabbitTemplate SimpleMessageListenerContainer

    一.RabbitTemplate介绍 RabbitTemplate:消息模板,在与Spring AMQP整合时,进行发送消息的关键类. 包括了可靠性投递消息方法.回调监听消息接口ConfirmCall ...

  9. Chisel3 - Wire & Reg

    https://mp.weixin.qq.com/s/Y26N5P4XOr5e3uyi5XQY-w   不同于Verilog,Chisel中Wire和Reg并不是数据类型,而是数据容器,作为数据的一个 ...

  10. JUC : 并发编程工具类的使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JUC是什么 1.JUC定义 JUC,即java.util.concurrent 在并发编程中使用的 ...