• forName 和.class


    package com.example.demo.reflact;
    
    public class A {
        public static String cc = "cccc";
        static {
            cc="32323232";
            System.out.println("静态初始化2322323");
        }
    
    
        public void hello() {
            System.out.println("hello world"+cc);
        }
    }

    区别:

    (1)Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。

    (2)而classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

    #Class.forName(name,initialize,loader)带参数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象。


    ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流后放到JVM中。Class.forName()方法实际上也是调用的CLassLoader来实现的。



    作者:代码之尖
    链接:https://www.jianshu.com/p/2dbfec55c987
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    package com.example.demo.reflact;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class TestClassLoad {
    
        public static void main(String[] args) throws Exception {
    //        m1();
    //        m2();
            m3();
    //        m4();
            return;
    
        }
    
        private static void m4() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            A a = new A();
            Class<?> clz = a.getClass();
            Object o = clz.newInstance();
            Method m = clz.getDeclaredMethod("hello", null);
            m.invoke(o);
    
        }
    
        private static void m3() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            Class<?> clz = A.class;
            Object o = clz.newInstance();
            Method m = clz.getDeclaredMethod("hello", null);
            m.invoke(o);
    
        }
    
        private static void m2() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            Class<?> clz = Class.forName("com.example.demo.reflact.A");
            Object o = clz.newInstance();
            Method m = clz.getDeclaredMethod("hello", null);
            m.invoke(o);
        }
    
        private static void m1() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            Class<?> clz = Class.forName(A.class.getName());
            Object o = clz.newInstance();
            Method m = clz.getDeclaredMethod("hello", null);
            m.invoke(o);
        }
    
    }

    参考:https://www.cnblogs.com/Marydon20170307/p/9815325.html

  • 相关阅读:
    OGG_GoldenGate数据控制进程Manager(案例)
    OGG_GoldenGate安装和环境搭建(案例)
    OGG_Oracle GoldenGate简介(概念)
    DBA_Oracle Erp R12系统文件结构(概念)
    PLSQL_统计信息系列10_统计信息过旧导致程序出现性能问题
    PLSQL_统计信息系列09_统计信息在不同数据库中迁移
    Hadoop2源码分析-准备篇
    高可用Hadoop平台-答疑篇
    高可用Hadoop平台-实战尾声篇
    高可用Hadoop平台-实战
  • 原文地址:https://www.cnblogs.com/leeego-123/p/13994083.html
Copyright © 2020-2023  润新知