Class c = Class.forName(“A”); factory = (AInterface)c.newInstance();
String className = "A"; Class c = Class.forName(className); factory = (AInterface)c.newInstance();
String className = readfromXMlConfig; //从xml 配置文件中获得字符串 Class c = Class.forName(className); factory = (AInterface)c.newInstance();
但是使用newInstance时候,就必须保证:
1、这个类已经加载;
2、这个类已经连接了。
而完成上面两个步骤的正是class的静态方法forName方法,这个静态方法调用了启动类加载器(就是加载java API的那个加载器)。
有了上面jvm上的理解,那么我们可以这样说, newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。new: 强类型。相对高效。能调用任何public构造。
public class A { private A() { System.out.println("A's constructor is called."); } private A(int a, int b) { System.out.println("a:" + a + " b:" + b); } }
public class B { public static void main(String[] args) { B b=new B(); out.println("通过Class.NewInstance()调用私有构造函数:"); b.newInstanceByClassNewInstance(); out.println("通过Constructor.newInstance()调用私有构造函数:"); b.newInstanceByConstructorNewInstance(); } /*通过Class.NewInstance()创建新的类示例*/ private void newInstanceByClassNewInstance(){ try {/*当前包名为reflect,必须使用全路径*/ A a=(A)Class.forName("reflect.A").newInstance(); } catch (Exception e) { out.println("通过Class.NewInstance()调用私有构造函数【失败】"); } } /*通过Constructor.newInstance()创建新的类示例*/ private void newInstanceByConstructorNewInstance(){ try {/*可以使用相对路径,同一个包中可以不用带包路径*/ Class c=Class.forName("A"); /*以下调用无参的、私有构造函数*/ Constructor c0=c.getDeclaredConstructor(); c0.setAccessible(true); A a0=(A)c0.newInstance(); /*以下调用带参的、私有构造函数*/ Constructor c1=c.getDeclaredConstructor(new Class[]{int.class,int.class}); c1.setAccessible(true); A a1=(A)c1.newInstance(new Object[]{5,6}); } catch (Exception e) { e.printStackTrace(); } } }