alkar
alkar

Reputation: 5511

How to get a Class Object from the Class Name in Java

I know the class name, say "MyClass" and want to retrieve the Class object, ie. MyClass.class for future references. Is there a way to do that?

I've looked through the web but most of the things I found related to it were about the ClassLoader, which I presume are not suitable for my case. I do not want to initialize a class, but only get a class object for future uses.

EDIT: Regarding the first answers to this:

I've already checked the forName() method but I thought that is supposed to also initialize the class. Now I can call it with the full arguments and pass false to the second argument, but would the third have to be null or what?

Would

Class.forName("MyClass", false, null);

return MyClass.class?

In fact, what I want to do, is replace an array of String IDs associated with Class objects, with an array of IDs from which the class objects are fetched automatically, to get rid of some manual work :)

Thanks for the quick answers and sorry for not mentioning this before.

Upvotes: 52

Views: 91063

Answers (5)

William H. Hooper
William H. Hooper

Reputation: 655

If you don't want to specify the full package name, call:

Class.forName("MyClass", true, this.getClass().getClassLoader());

This syntax allows you to reorganize the project, or copy this code into another project, as long as you move MyClass along with it. Thanks to Joachim for reminding me to read the docs!

Upvotes: 2

Droo
Droo

Reputation: 3205

It's also worth noting that the above suggestions are correct, but will only work for default (parameterless) constructors. You could also do something like:

    public Object newInstance(String className, Object...args) throws Exception {
        Class<?> clazz = Class.forName(className);
        if(args == null || args.length == 0) {
            return clazz.newInstance();
        }

        List<Class<?>> argTypes = new ArrayList<Class<?>>();
        for(Object object : args) {
            argTypes.add(object.getClass());
        }
        Constructor<?> explicitConstructor = clazz.getConstructor(argTypes.toArray(new Class[argTypes.size()]));
        return explicitConstructor.newInstance(args);
    }

Upvotes: 4

Tony the Pony
Tony the Pony

Reputation: 41347

You can use:

Class c = Class.forName("com.package.MyClass");

And later instantiate an object:

Object obj = c.newInstance();

EDIT: This is just the simplest use case. As indicated in the comments, you will need to consider constructor arguments and exceptions thrown by the initialization process. The JavaDocs for newInstance has all the details.

Upvotes: 76

Thomas Owens
Thomas Owens

Reputation: 116161

It sounds like you might be able to use the Class class's static forName method.

Upvotes: 3

Joachim Sauer
Joachim Sauer

Reputation: 308001

Class.forName("MyClass")

Read the JavaDoc for details

Upvotes: 8

Related Questions