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

前端 未结 5 903
故里飘歌
故里飘歌 2020-12-15 15:37

I know the class name, say \"MyClass\" and want to retrieve the Class object, ie. MyClass.class for future references. Is ther

相关标签:
5条回答
  • 2020-12-15 15:47

    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.

    0 讨论(0)
  • 2020-12-15 15:56

    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!

    0 讨论(0)
  • 2020-12-15 15:59
    Class.forName("MyClass")
    

    Read the JavaDoc for details

    0 讨论(0)
  • 2020-12-15 16:00

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

    0 讨论(0)
  • 2020-12-15 16:01

    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);
        }
    
    0 讨论(0)
提交回复
热议问题