I need a quick approach to something like:
MyClass mc = new MyClass();
String theName = ClassNameProvider.getName(mc); // returns 'MyClass'
Salesforce Stack Exchange is a question and answer site for Salesforce administrators, implementation experts, developers and anybody in-between. It only takes a minute to sign up.
Sign up to join this communityI need a quick approach to something like:
MyClass mc = new MyClass();
String theName = ClassNameProvider.getName(mc); // returns 'MyClass'
I think your requirement falls in the gap for apex but we have the ability to do one of following things:
We can retrieve the name of an object using code such as
String name = MyClass.class.getName(); //returns MyClass
We can check whether the instance of a particular type using
Boolean isSame = mc instanceof MyClass; //returns true
Or if we want to get the name from an instance of an unknown type we can do:
String name = String.valueOf(mc).split(':')[0];//returns MyClass
Hopefully one of those covers your need. See the discussion to a similar question here for more info.
String.valueOf(mc).split(':')[0]
will not include the top level class for inner classes
String.valueOf(mc)
returns the toString()
value of the class. The default return value is format of ClassName:[field1=value1, field2=value2,...fieldN=valueN]
but if the class overrides the toString()
method then this trick may not work for you.
Jun 22, 2018 at 4:54
String name = String.valueOf( mc ).substringBefore( ':' )
as it's just a little bit clearer
Nov 7, 2019 at 11:42
This is an interesting hack as posted on the idea Method to get the Type of an Object (also Primitive Type not only SObject) by Robert Strunk:
public static String getObjectType(Object obj){
String result = 'DateTime';
try{
DateTime typeCheck = (DateTime)obj;
}
catch(System.TypeException te){
String message = te.getMessage().substringAfter('Invalid conversion from runtime type ');
result = message.substringBefore(' to Datetime');
}
return result;
}
The parse conversion exception approach overcomes the caveat that using String.valueOf(obj).split(':')[0]
does not work in scenarios where the Apex class' toString()
method has been overriden and returns a value in a different format, as pointed out in this comment.
To answer the title of the question: to get the name of the class from within any class use this:
String CurrentClassName = String.valueOf(this).substring(0,String.valueOf(this).indexOf(':'));
String.valueOf(mc).split(':')[0]
among other approaches. This approach is just a slower version of that (you take String.valueOf
twice).