一 java的类和class

1-1 一个class对象就是一个类的说明书,对象.getClass()方法,可以获取到具体的类(全限定名字)。

  1. new Cat()
  2. // 这句代码就是告诉jvm,我要一直猫。 那么jvm就会根据猫这个的说明书,在堆中造出一只猫来

1-2 Class对象的生命周期

在第一次使用的时候被加载。
比如要创建一个对象,new Cat(); 这时候用到了Cat这个类的说明书,那么Cat这个类就会被加载
image.png

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 动态的创建一个对象

  1. import java.lang.reflect.InvocationTargetException;
  2. public class Cat {
  3. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
  4. // 根据传递参数的名字,创建一个对应的对象
  5. // 比如 参数传递 java.lang.String -> String 那么就创建一个String对象
  6. String className = args[0];
  7. Class c = Class.forName(className);
  8. Object obj = c.getConstructor().newInstance();
  9. }
  10. }

2.2.2 动态的调用方法

  1. import java.lang.reflect.InvocationTargetException;
  2. public class Cat {
  3. public void catchMouse() {
  4. System.out.println("catchMouse");
  5. }
  6. public void beCute() {
  7. System.out.println("beCute");
  8. }
  9. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
  10. // 根据传递参数的名字,调用一个方法
  11. // beCute catchMouse 是字符串,可以被传递进来
  12. Cat cat = new Cat();
  13. cat.getClass().getMethod("beCute").invoke(cat);
  14. cat.getClass().getMethod("catchMouse").invoke(cat);
  15. }
  16. }

2.2.3 动态的获取属性

  1. import java.lang.reflect.InvocationTargetException;
  2. public class Cat {
  3. public String head = "head";
  4. public String foot = "foot";
  5. public void catchMouse() {
  6. System.out.println("catchMouse");
  7. }
  8. public void beCute() {
  9. System.out.println("beCute");
  10. }
  11. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
  12. Cat cat = new Cat();
  13. System.out.println(cat.getClass().getField("head").get(cat));
  14. System.out.println(cat.getClass().getField("foot").get(cat));
  15. }
  16. }