5-2-java反射

文章目录
  1. 1. java反射
    1. 1.1. 知识点脑图
    2. 1.2. 动态语言(在运行时可以改变其结构,新函数可引进,已有函数可删除)
    3. 1.3. 反射(运行状态中知道类所有的属性和方法,并调用)
    4. 1.4. 应用场合
      1. 1.4.1. 编译时类型和运行时类型
    5. 1.5. 反射api
    6. 1.6. 获取class对象的3种方法
      1. 1.6.1. 调用实例的getClass方法
      2. 1.6.2. 某个类的class属性
      3. 1.6.3. Class类的forName静态方法(安全,性能最好。进行了初始化)
    7. 1.7. 创建对象的两种方法
      1. 1.7.1. class的newInstance方法
      2. 1.7.2. 调用construstor的NewInstance方法
    8. 1.8. !!!一个java类造成类被初始化的操作。
    9. 1.9. 初始化运行顺序

java反射

知识点脑图

image-20210720142813087

动态语言(在运行时可以改变其结构,新函数可引进,已有函数可删除)

  1. js, ruby, python属于动态语言
  2. c不属于
  3. 从反射角度说java属于半动态语言

反射(运行状态中知道类所有的属性和方法,并调用)

应用场合

编译时类型和运行时类型

Person p=new Student();

其中编译时类型为 Person,运行时类型为 Student。

如果编译时根本无法预知该对象和类属于哪些类,程序只能依靠运行时信息来发现该对象和类的真实信息,此时就必须使用到反射了。

反射api

class类,field类,method类,constructor类(类的构造方法)

获取class对象的3种方法

调用实例的getClass方法

Person p=new Person();

Class clazz=p.getClass();

某个类的class属性

Class clazz=Person.class;

Class类的forName静态方法(安全,性能最好。进行了初始化)

Class clazz=Class.forName(“类的全路径”); (最常用)

创建对象的两种方法

class的newInstance方法

这种方法要求该 Class 对象对应的类有默认的空构造器。

1
2
//使用.newInstane 方法创建对象
Person p=(Person) clazz.newInstance();

调用construstor的NewInstance方法

1
2
3
4
5
6
7
8
//获取 Person 类的 Class 对象
Class clazz=Class.forName("reflection.Person");

//获取构造方法并创建对象
Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);

//创建对象并设置属性
Person p1=(Person) c.newInstance("李四","男",20);

!!!一个java类造成类被初始化的操作。

  1.创建一个java类的实例对象。比如调用“MyClass obj = new MyClass()”语句时,类MyClass会被初始化。

  2.调用一个java类中的静态方法。比如上面中的第二个例子。

  3.为类或接口中的静态域赋值。比如myField是MyClass类中的静态域,调用”MyClass.myField = 10”会使MyClass类被初始化。

  4.访问类或接口中申明的静态域,并且该域的值不是常值变量。也就是不是static final 修饰的变量。

  5.在一个顶层java类中执行assert语句也会使该java类被初始化。

  6.调用Class类和反射API中进行反射操作的方法也会初始化java类。

初始化运行顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class InitDemo {
public static void main(String[] args) {
System.out.println("第一次实例化子类:");
new sub();
System.out.println("第二次实例化子类:");
new sub();
}
}

class Super{
static {
System.out.println("父类中的静态块");
}
{
System.out.println("父类中的非静态块");
}
Super(){
System.out.println("父类中的构造方法");
}
}

class sub extends Super{
static {
System.out.println("子类中的静态块");
}
{
System.out.println("子类中的非静态块");
}
sub(){
System.out.println("子类中的构造方法");
}
}

image-20210720144651183