zoukankan      html  css  js  c++  java
  • Java反射中Class.forName和classloader的区别

    Java中Class.forName和classloader都可以用来对类进行加载。

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

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

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

    package com.yu.java.reflect;
    
    public class Line {
        static {
            System.out.println("static code executing: loading line...");
        }
    }
    package com.yu.java.reflect;
    
    public class Point {
        static {
            System.out.println("static code executing: loading point...");
        }
    }
    package com.yu.java.reflect;
    
    public class ClassLoaderAndForNameTest {
    
        public static void main(String[] args) {
            String wholeNameLine = "com.mangosoft.java.reflect.Line";
            String wholeNamePoint = "com.mangosoft.java.reflect.Point";
    
            System.out.println("classloader testing...");
            testClassLoader(wholeNameLine, wholeNamePoint);
            System.out.println("---------------------------------------");
            System.out.println("Class.forName testing...");
            testForName(wholeNameLine, wholeNamePoint);
        }
    
        //classloader
        public static void testClassLoader(String wholeNameLine, String wholeNamePoint) {
            ClassLoader loader = ClassLoader.getSystemClassLoader();
            Class<?> line;
            Class<?> point;
            try {
                line = loader.loadClass(wholeNameLine);
                point = loader.loadClass(wholeNamePoint);
                System.out.println("line " + line.getName());
                System.out.println("point " + point.getName());
            } catch (ClassNotFoundException e){
                e.printStackTrace();
            }
        }
    
        //Class.forName
        public static void testForName(String wholeNameLine, String wholeNamePoint) {
            try {
                Class line = Class.forName(wholeNameLine);
                Class point = Class.forName(wholeNamePoint);
                System.out.println("line " + line.getName());
                System.out.println("point " + point.getName());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    运行结果如下:

  • 相关阅读:
    设计模式-代理模式
    设计模式-策略模式
    设计模式-单例模式
    优先队列
    n!中质因子个数
    计算组合数
    高精度
    memset用法
    质因子分解
    素数筛法
  • 原文地址:https://www.cnblogs.com/yuandluck/p/9476238.html
Copyright © 2011-2022 走看看