1、反射机制
1.1、反射机制有什么用?
通过java语言中的反射机制可以操作字节码文件。
有点类似于黑客。(可以读和修改字节码文件。)
通过反射机制可以操作代码片段。(class文件。)
1.2、反射机制的相关类在那个包下?
java.lang.reflect.*;
1.3、反射机制相关的类有哪些?
java.lang.Class 代表字节码文件
java.lang.reflect.Method 代表字节码中的方法字节码
java.lang.reflect.Constructor 代表字节码中的构造方法字节码
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;
}
}
2、关于JDK中自带的类加载器:
2.1、什么是类加载器?
专门负责加载类的命令/工具。
ClassLoader
2.2、JDK中自带了三个类加载器
启动类加载器
扩展类加载器
应用类加载器
2.3、假设有一段代码
String s="abc" ;
代码在开始执行之前,会将所有的类全部加载到JVM当中。
通过类加载器加载,看到以上代码类加载器会找String.class
文件,找到就加载,那么是怎么进行加载的呢?
首先通过“启动类加载器”加载
注意:启动类加载器专门加载:E:\java tools\JDK8\jdk1.8.0_101\jre\lib\rt.jar
rt.jar中都是JDK最核心的类库。
如果通过“启动类加载器”加载不到的时候。
会通过“扩展类加载器”加载。
注意:扩展类加载器专门加载:E:\java tools\JDK8\jdk1.8.0_101\jre\lib\ext\*.jar
如果通过“扩展类加载器”没有加载到的时候
会通过“应用类加载器”加载。
注意:应用类加载器专门加载:classpath中的类。
2.4、java为了保证类加载的安全,使用了双亲委派机制。
优先从启动类加载器中加载,这个称为“父”
“父”无法加载的时候,再从扩展类加载器中
加载,这个称为“母”。双亲委派。如果都加载
不到,才会考虑从应用类加载器中加载,直到加载
到为止。
要操作一个类的字节码,需要首先获取到这个类的字节码,怎么获取java.lang.Class实例?
三种方式:
第一种:Class c=Class.forName("完整的类名带包名");
第二种:Class c=引用.getClass();
第三种:Class c=任何类型.class属性
Class.forName()
1、静态方法
2、方法参数是一个字符串
3、字符串需要的是一个完整类名
4、完整类名必须带有包名。
c1=Class.forName("java.lang.String"); //c1代表String.Class文件,或者说c1代表String类
java中任何一个对象都有一个方法:getClass();
String s="abc";
Class x=s.getClass();
java语言中任何一种类型,包括基本数据类型,都有.Class属性。
Class z= String.class;
获取到Class,能干什么?
通过Class的newInstance()方法来实例化对象。
注意:newInstance()方法内部实际上调用了无参数构造方法,必须保证无参数构造存在才可以。
通过反射机制获取Class,通过Class来实例化对象
Class c=Class.forName("home.mjjhy.java.bean.User");
//重点是:newInstance()调用的是无参构造,必须保证无参构造是存在的。
Object obj=c.newInstance();//home.mjjhy.java.bean.User@6bdf2