APEX: Use a dynamic string to create an instance of a class
I have an abstract class called Process that I extend to create a list of processes (List
I've tried something like the following:
String s = 'Account'; List activeProcesses = [SELECT Name FROM Process__c WHERE Active__c = TRUE AND Object__c = :s]; List processNames = Utils.Data.Convert.stringList(activeProcesses, 'Name'); Type t = Type.forName('Process'); List processes = new List(); for(String processName : processNames){ Process p = t.newInstance(processName); processes.add(p); }
The error I'm getting when attempting this is: Method does not exist or incorrect signature: [Type].newInstance(String) I really hope the harsh reality isn't that this is just not possible but if it is I need to know that as well, so any insight you have with this question would be greatly appreciated.
Your strategy will work to solve apex string class, but your constructor must contain no parameters, and the same goes for your newInstance() call. You pass the name of the Type you want to construct into the Type.forName method.
Type customType = Type.forName('SomeClass'); SomeClass instance = (SomeClass)customType.newInstance();
You probably will want to implement an interface here as well. Something like:
public interface IProcess { void execute(); } public class Process1 { public Process1() { // instantiation logic } public void execute() { // execution logic } }
You would use the above as follows:
IProcess instance = (IProcess)Type.forName('Process1').newInstance();
You don't even really need to cache it for simple cases:
(IProcess)Type.forName('Process1').newInstance().execute();