反射机制
反射机制有什么用?
通过Java语言中的反射机制可以修改操作字节码文件(可以读和修改字节码文件)
可以操作代码片段
反射机制的相关类在哪个包下?
java.lang.reflext.*
反射机制相关的重要的类有哪些?
java.lang.Class 代表整个字节码,代表一个类型,代表整个类
java.lang.reflect.Constructor 代表字节码中的构造方法字节码,代表类中的构造方法
java.lang.reflect.Method 代表字节码中的方法字节码,代表类中的方法
java.lang.reflect.Field 代表字节码中的属性字节码,代表类中的成员变量(静态变量和实例变量)
java.lang.Class
public class User{
//Field
int no;
//Constructor
public User(){
}
public User(int no){
this.no = no;
}
//Method
public void setNo(int no){
this.no = no;
}
public int getNO(){
return no;
}
}
获取class的三种方式
第一种:
Class c = Class.forName("完整类名带包名");
Class.forName()要求:
1.静态方法
2.方法的参数必须是一个字符串
3.字符串需要是一个完整的类名
4.完整类名必须带有包名。java.lang包也不能省略
第二种:java中任何一个对象都有一个方法:getClass()
Class c = 对象.getClass();
第三种:java语言中任何一种类型,包括基本数据类型,它都有.class属性
Class z = String.class; //z代表String类型
Class k = Date.class; //k代表Date类型
Class f = int.class; //f代表int类型
Class e = double.class; //e代表double类型
关于JDK自带的类加载器:
什么是类加载器?
专门负责加载类的命令/工具
JDK自带了三个类加载器:
启动类加载器(父加载器)rt.java
扩展类加载器(母加载器)ext/*.jar
应用类加载器 classpath
假设有这样一段代码:
String s = "abc";
代码在开始执行之前,会将所需要类全部加载到JYM中。
通过类加载器加载,看到以上代码类加载器会找到String.class文件,找到就加载,那么是怎么进行加载的呢?
首先是通过“启动类加载器”加载
注意:启动类加载器专门加载:C:Program FilesJavajdk1.8.0_101jrelib t.jar
rt.jar中都是JDK最核心的类库。
如果通过“启动器加载类”没有加载到,那么会通过“扩展类加载器”加载。
注意:扩展类加载器专门加载:C:Program FilesJavajdk1.8.0_101jrelibext*.jar
如果“扩展类加载器”没有加载到,那么会通过“应用类加载器”加载。
注意:应用类加载器专门加载:classpath中的类。
Java中为了保证类加载的安全,使用了双亲委派机制,优先从启动类加载器中加载,这个称为“父”,“父”无法加载到,再从扩展类加载器中加载,这个称为“母”。双亲委派。如果都加载不到,才会考虑从应用类加载器中加载,直到加载到为止。