Getting class by its name
Solution 1:
use forName instead..
something like this..
try {
Class<?> act = Class.forName("com.bla.TestActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Solution 2:
You can use Class::forName
to get a class object of unknown type.
If you want to get a typed class, you can use Class::asSubclass
on the class returned by Class::forName
:
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
Of course you will also have to handle a bunch of different types of exceptions. As is usual when dealing with reflection.
Solution 3:
The Class.forName seems to have exceptions on it. This is just to expand upon the above to address this issue.
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
Solution 4:
I also had a similar requirement, I had a json coming from backend which contains the screen and activity mapping. Since the json in common for both iOS/ Android, we couldnt add terms like Activity
into the json, so this is what we did
In json for all
Activity
orViewcontrollers
, use simple names ie forHomeActivity
andHomeViewController
we will use "Home" in the jsonIn app, we parse the json and I have written the below utility methods to get the activity dynamically
To get the name of the class (ie if we pass Home, we will get back com.package.HomeActivity
)
fun getClassInfoFor(name: String, context: Context):String{
var str = "${context.getPackageName()}.${name}Activity"
return str
}
Now to get class from string
try {
val className = Utilties.getClassInfoFor(activityNameFromJSON, context)
val fetchedClass = Class.forName(className)
val showDetailsIntent = Intent(context, fetchedClass)
context.startActivity(showDetailsIntent)
} catch (e: ClassNotFoundException) {
e.printStackTrace()
}
This way I can easily manage multiple classes with the same method. I use this in a recycler view where my every cell navigates to a different activity.