动态语言与静态语言
动态语言:运行时代码可以根据某些条件改变自身的结构
静态语言:不能改变
java不算是纯静态语言,可以根据反射机制获得类似动态语言的效果
java reflection
反射是java被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API获取任何类的内部信息,并且直接操作任意对象的内部属性及方法
加载完类之后,在堆的内存中方法区中就会产生一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息,我们可以通过对这个对象看到类的结构,这个对象就像一个镜子,透过这个镜子看到类的结构,所以我们称之为反射
package reflection;
/**
* @Classname ReflectionTest1
* @Description TODO
* @Date 2020/3/14 20:06
* @Created by mmz
*/
public class ReflectionTest1 {
public static void main(String[] args) throws Exception {
//通过反射获得
Class cls= Class.forName("reflection.User");
System.out.println(cls);
}
}
class User{
private Integer id;
private Integer age;
private String name;
public User() {
}
public User(Integer id, Integer age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
不管创建多少个类的对象,始终只有一个实例。
一个类在内存中,只有一个class对象
一个类被加载后,整个结构都会被封装在class对象中
三种方式创建类的实例
具有class对象的类
java内存分析
类的加载过程
什么时候类会初始化
类加载器的作用
我们直接创建的类的加载器,就是appclass加载器 系统类加载器
而object加载器就是根加载器 引导类加载器
还剩下一个拓展类加载器
双亲委派模式
双亲委派模式
主要为了安全
获取运行时类的完整结构