一 java的类和class
1-1 一个class对象就是一个类的说明书,对象.getClass()方法,可以获取到具体的类(全限定名字)。
new Cat()
// 这句代码就是告诉jvm,我要一直猫。 那么jvm就会根据猫这个的说明书,在堆中造出一只猫来
1-2 Class对象的生命周期
在第一次使用的时候被加载。
比如要创建一个对象,new Cat(); 这时候用到了Cat这个类的说明书,那么Cat这个类就会被加载
1-3 Class和ClassLoader
1.3.1 怎么把.Class文件加载到内存中? ClassLoader来干这个活儿
- ClassLoader负责从外部系统中加载一个类
- 这个类对应的java文件并不一定需要存在, 直接写一个.class文件,也能被加载
- 这个.class并不一定需要存在,可以从网上获取一个字节流(.class文件或者一些文件都是字节流)
- 这是java世界丰富多彩的应用的基石
- ClassLoader的双亲委派加载模型(其实是单亲,只有一个父亲,但是parent翻译成了双亲)
- classloader要加载某个类的时候,先让自己的父亲类加载器去加载,加载到了的话,子加载器不会加载这个类了。
二 反射
2-1 由来
一个对象可以动态的知道自己有什么东西,叫做反射。一个人照镜子一样,可以看清楚自己身上脸上有什么。
2-2 反射的作用
2.2.1 动态的创建一个对象
import java.lang.reflect.InvocationTargetException;
public class Cat {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// 根据传递参数的名字,创建一个对应的对象
// 比如 参数传递 java.lang.String -> String 那么就创建一个String对象
String className = args[0];
Class c = Class.forName(className);
Object obj = c.getConstructor().newInstance();
}
}
2.2.2 动态的调用方法
import java.lang.reflect.InvocationTargetException;
public class Cat {
public void catchMouse() {
System.out.println("catchMouse");
}
public void beCute() {
System.out.println("beCute");
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// 根据传递参数的名字,调用一个方法
// beCute catchMouse 是字符串,可以被传递进来
Cat cat = new Cat();
cat.getClass().getMethod("beCute").invoke(cat);
cat.getClass().getMethod("catchMouse").invoke(cat);
}
}
2.2.3 动态的获取属性
import java.lang.reflect.InvocationTargetException;
public class Cat {
public String head = "head";
public String foot = "foot";
public void catchMouse() {
System.out.println("catchMouse");
}
public void beCute() {
System.out.println("beCute");
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
Cat cat = new Cat();
System.out.println(cat.getClass().getField("head").get(cat));
System.out.println(cat.getClass().getField("foot").get(cat));
}
}