反射
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());
}
}
类的加载器获取:
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
图片摘自狂神: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类中的方法可得知