2021-10-24

反射

public class RefTest {
    public static void main(String[] args)throws  ClassNotFoundException{
        //通过类名.class调用来获得Class类,最安全可靠
        Class c1=Reflect.class;
        System.out.println(c1);

        //通过对象获得Class类
        System.out.println(new Reflect().getClass());

        //通过Class类中的静态方法forName来获得Class类,可能需要抛出异常
        String classname="reflect.Reflect";
        Class c2=Class.forName(classname);
        System.out.println(c2);

        //基本内置类型中的包装类都有Type属性,通过它获得class类
        Class c4=Integer.TYPE;
        System.out.println(c4);

        //获得父类类型的Class类
        System.out.println(new Reflect().getClass().getSuperclass());

        //同一种属性类型的哈希值一样
        String name="s";
        String name1="dadfa";
        System.out.println(name.getClass().hashCode()+" \t "+name1.getClass().hashCode());
        int[] a=new int[10];
        int[] c=new int[100];
        System.out.println(a.getClass().hashCode()+"\t"+c.getClass().hashCode());
    }
}

2021-10-24
类的加载器获取:

public class LoaderTest {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取系统加载器
       ClassLoader c1=ClassLoader.getSystemClassLoader();
        System.out.println(c1);
        //获取系统加载器的父类加载器,即扩展加载器
        ClassLoader c2=c1.getParent();
        System.out.println(c2);
        //获取扩展加载器的父类加载器,即根加载器
        ClassLoader c3=c2.getParent();
        System.out.println(c3);

        //当前类的加载器
        Class c=Class.forName("ClassLoader.Student");
        ClassLoader a1=c.getClassLoader();
        System.out.println(a1);

        
    }
}
sun.misc.Launcher$AppClassLoader@b4aac2
sun.misc.Launcher$ExtClassLoader@16d3586
null   //根加载器不能直接获取
sun.misc.Launcher$AppClassLoader@b4aac2

2021-10-24
图片摘自狂神:https://www.bilibili.com/video/BV1p4411P7V3?p=10&spm_id_from=pageDriver
通过类来反射获取类的信息:

public class LoaderTest {
    public static void main(String[] args) throws ClassNotFoundException {
        //当前类的加载器
        Class c = Class.forName("ClassLoader.Student");
        ClassLoader a1 = c.getClassLoader();
        System.out.println(a1);
		//获得的属性名等以数组形式存在,所有用for each方法
    for(Field fiel:c.getFields()){    //获取公共的属性
        System.out.println(fiel);
    }
        for (Field field:c.getDeclaredFields()    //获取所有方法,包括私有的方法
            ) {
        System.out.println(field);
    }
    }
}

sun.misc.Launcher$AppClassLoader@b4aac2
public int ClassLoader.Student.age
public java.lang.String ClassLoader.Student.name
public int ClassLoader.Student.age
public java.lang.String ClassLoader.Student.name
private int ClassLoader.Student.id

还有很多方法,查找API中的Class类中的方法可得知

上一篇:线程上下文类加载器


下一篇:深入分析ClassLoader工作机制