先看段代码吧:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("en.Dog");
//Class clazz = Class.forName("en.Dog");
System.out.println(clazz.getClassLoader());
Class[] paras = new Class[]{String.class,Integer.class};
Constructor cons = clazz.getConstructor(paras);
Object[] ob = new Object[]{"wode",4};
Dog dog = (Dog)cons.newInstance(ob);
dog.eat();
这段代码没有直接用Dog dog = new Dog()的形式去得到目标类的实例。而是使用了反射。
ClassLoader loader = Thread.currentThread().getContextClassLoader();这句代码是返回当前的类加载器。然后利用Class clazz = loader.loadClass("en.Dog");来加载一个固定的类,必须记住的是类必须是全类名,即使该类是jdk默认的类,如Integer,也必须写成java.lang.Integer。 我们都知道,在JDBC的代码中经常会看到一句Class.forName()的代码。其实这句代码只不过把上面两句和在一起了。
得到了一个类的Class实例,我们就能得到这个类的所有信息。Constructor cons = clazz.getConstructor(paras); 这句代码就是去调用目标类的构造方法