T java.lang.Class#newInstance():这个方法只需要提供java.lang.Class<T>的实例就可以实例化对象,如果提供的是无限定类型Class<?>则得到的是Object类型的返回值,可以进行强转。这个方法不支持任何入参,底层实际上也是依赖无参数的构造器Constructor进行实例化。
T java.lang.reflect.Constructor#newInstance(Object ... initargs):这个方法需要提供java.lang.reflect.Constructor<T>实例和一个可变参数数组进行对象的实例化,上面提到的T java.lang.Class#newInstance()底层也是依赖此方法。这个方法除了可以传入构造参数之外,还有一个好处就是可以通过``抑制修饰符访问权限检查,也就是私有的构造器也可以用于实例化对象。
ClassLoader#loadClass()方法就是用于控制类加载过程的第一步-加载过程,也就是控制字节码字节数组和类名生成Class实例的过程。ClassLoader中还有一个protected final Class<?> defineClass(String name, byte[] b, int off, int len)方法用于指定全类名和字节码字节数组去定义一个类,我们再次看下loadClass()的源码:
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{ synchronized (getClassLoadingLock(name)) { // 检查类是否已经加载过,如果已经加载过,则直接返回 Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); // 委派父类加载器去加载类 try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } // 委派父类加载器如果加载失败则调用findClass方法进行加载动作 if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass(name);
// this is the defining class loader; record the stats PerfCounter.getParentDelegationTime().addTime(t1 - t0); PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); PerfCounter.getFindClasses().increment(); } } if (resolve) { resolveClass(c); } return c; } } // 扩展点-1 protected Class<?> findClass(String name) throws ClassNotFoundException { thrownew ClassNotFoundException(name); } // 扩展点-2 protectedfinalvoidresolveClass(Class<?> c){ if (c == null) { thrownew NullPointerException(); } }
@CallerSensitive publicstatic Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException { Class<?> caller = null; SecurityManager sm = System.getSecurityManager(); if (sm != null) { // Reflective call to get caller class is only needed if a security manager // is present. Avoid the overhead of making this call otherwise. caller = Reflection.getCallerClass(); if (loader == null) { ClassLoader ccl = ClassLoader.getClassLoader(caller); if (ccl != null) { sm.checkPermission( SecurityConstants.GET_CLASSLOADER_PERMISSION); } } } return forName0(name, initialize, loader, caller); }
返回给定字符串全限定名称、指定类加载器的类或者接口的Class实例,此方法会尝试对类或者接口进行locate、load and link操作,如果loader参数为null,则使用bootstrap类加载器进行加载,如果initialize参数为true同时类或者接口在早期没有被初始化,则会进行初始化操作。