1

我有许多实现可调度接口的类。我想通过另一个顶点课程一次安排多个 Apex 课程。所以我需要查询所有实现Schedulable接口的类。

我正在使用以下代码片段来实现这一点,但我收到如下编译器错误

错误:“您必须选择实现可调度接口的 Apex 类。在第 127 行第 13 列”

代码:

list<ApexClass> listClasses; 

String input='0 0 8 13 2 ?';

listClasses=[Select Id, Name,body from ApexClass]   
for(ApexClass a:listClasses){            
        system.schedule(a.Name+' AutoScheduler', input, a);    
}

问题:如何查询所有实现可调度接口的顶点类?这样我就可以直接将它传递给 system.schedule() 方法。

不同的尝试:收到此错误后,我尝试仅查询一个实现可调度接口的顶点类(已知类)。又没用。请参阅下面的片段以了解不同的尝试

代码:

list<ApexClass> listClasses; 

String input='0 0 8 13 2 ?';

//Retriving only one class of Name='SchedularTest' 

listClasses=[Select Id, Name,body from ApexClass where Name ='SchedularTest']   
for(ApexClass a:listClasses){            
        system.schedule(a.Name+' AutoScheduler', input, a);    
}

错误:“您必须选择实现可调度接口的 Apex 类。在第 127 行第 13 列”

提前致谢

萨提斯库马尔

4

1 回答 1

5

我会说错误信息很清楚?

您传递给 System.schedule 的最后一个参数必须是一个新对象。类的新实例。你传递的是关于类的元数据信息,它的主体等......这些东西不能像那样“运行”。

我敢打赌这system.schedule('SchedulerTest AutoScheduler', input, new SchedulerTest());会行得通吗?如果没有 - 确保该类编译正常,也许还确保它是否被标记为有效。

看?您如何期望代表磁盘上数据库/文件中的一行的东西像类的对象一样“工作”?

如果您需要创建仅具有此类名称的给定类的新对象 - 您可能需要检查Type方法

String className = 'SchedulerTest';
Type t = Type.forName(className);

System.schedule(className, '0 0 8 13 2 ?', (Schedulable)t.newInstance());

这会创建一个新对象(它实际上是一个通用对象),然后将其转换为该方法可以接受的东西。如果该类未实现接口,您将遇到运行时失败:

System.TypeException:从运行时类型 SchedulerTest 到 system.Schedulable 的无效转换

于 2013-02-25T17:07:25.250 回答