美文网首页Java之旅java进阶干货Java 杂谈
学习Spring之前的Java相关基础知识

学习Spring之前的Java相关基础知识

作者: 直到世界的尽头_yifan | 来源:发表于2018-01-27 23:13 被阅读56次
    ·简单实例
    package com.spring.basic;
    
    public class Car {
        private String brand;
        
        private String color;
        
        private int maxSpeed;
        
        public Car(){}
    
        public Car(String brand, String color, int maxSpeed) {
            super();
            this.brand = brand;
            this.color = color;
            this.maxSpeed = maxSpeed;
        }
        
        public void introduce() {
            System.out.println("brand:"+brand+",color:"+color+",maxSpeed:"+maxSpeed);
        }
    
        public String getBrand() {
            return brand;
        }
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public int getMaxSpeed() {
            return maxSpeed;
        }
    
        public void setMaxSpeed(int maxSpeed) {
            this.maxSpeed = maxSpeed;
        };
    }
    
    package com.spring.basic;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    public class ReflectTest {
    
        public static void main(String[] args) throws Throwable {
            //调用类加载器获取Car对象
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            Class clazz = loader.loadClass("com.spring.basic.Car");
            
            //获取类的默认构造方法构造类对象并实例化Car
            Constructor cons = clazz.getConstructor();
            Car car = (Car) cons.newInstance();
            
            Method setBrand = clazz.getDeclaredMethod("setBrand", String.class);
            setBrand.invoke(car, "奔驰");
            Method setColor = clazz.getDeclaredMethod("setColor", String.class);
            setColor.invoke(car, "白色");
            Method setMaxSpeed = clazz.getDeclaredMethod("setMaxSpeed", int.class);
            setMaxSpeed.invoke(car, 200);
            car.introduce();
        }
    
    }
    

    输出以下信息

    brand:奔驰,color:白色,maxSpeed:200
    

    上面实例是通过java反射机制来控制目标类的元信息

    ·类装载器ClassLoader
    ·类装载器工作机制

    类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件,在java中,类装载器把一个类载入JVM中,要经过以下步骤:
    1.装载:查找和导入Class文件;
    2.链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的;
        a)校验:检查载入Class文件数据的正确性
        b)准备:给类的静态变量分配存储空间
        c)解析:将符号引用转成直接引用
    3.初始化:对类的静态变量、静态代码块执行初始化工作
    类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和载入Class字节码。JVM在运行时会产生3个ClassLoader,根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。其中,跟装载器不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类,其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包,AppClassLoader负责装载Classpath路径下的类包。
        这3个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器默认情况下使用AppClassLoader装载应用程序的类,我们可以做一个实验:

    package com.spring.basic;
    
    public class ClassLoaderTest {
    
        public static void main(String[] args) {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            System.out.println(loader);
            System.out.println(loader.getParent());
            System.out.println(loader.getParent().getParent());
        }
    
    }
    
    sun.misc.Launcher$AppClassLoader@439a8942
    sun.misc.Launcher$ExtClassLoader@56a96eba
    //根装载器在java中访问不到,所以返回null
    null
    

    JVM在装载类时使用“全盘负责委托机制”,“全盘委托”是指当一个类装载一个类时,除非显示的使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入;委托机制是指委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写了一个恶意的基础类并装载到JVM中将会引起多么可怕的问题。

    相关文章

      网友评论

        本文标题:学习Spring之前的Java相关基础知识

        本文链接:https://www.haomeiwen.com/subject/hwmoaxtx.html