Java反射

Java反射
1、反射机制有什么用?
 
通过java语言中的反射机制可以操作字节码文件(可以读和修改字节码文件。)
 
通过反射机制可以操作代码片段。(class文件。)
 
2、反射机制的相关类在哪个包下?
 
java.lang.reflect.*;
 
3、反射机制相关的重要的类有哪些?
 
含义
 
java.lang.Class 代表整个字节码。代表一个类型,代表整个类。
 
java.lang.reflect.Method 代表字节码中的方法字节码。代表类中的方法。
 
java.lang.reflect.Constructor 代表字节码中的构造方法字节码。代表类中的构造方法。
 
java.lang.reflect.Field 代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)。
 
注:必须先获得Class才能获取Method、Constructor、Field。
 
eg.
 
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;
 
}
 
}
 
4、获取Class的三方式
 
要操作一个类的字节码,需要首先获取到这个类的字节码,怎么获取java.lang.Class实例?
 
方式 备注
 
Class.forName(“完整类名带包名”) 静态方法
 
对象。getClass()
 
任何类型。class
 
注:以上三种方式返回值都是Class类型。
 
5、通过反射实例化对象
 
对象。newInstance()
 
1
 
注:newInstance()方法内部实际上调用了无参数构造方法,必须保证无参构造存在才可以。
 
否则会抛出java.lang.InstantiationException异常。
 
eg.
 
class ReflectTest02{
 
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
 
        // 下面这段代码是以反射机制的方式创建对象。
 
        // 通过反射机制,获取Class,通过Class来实例化对象
 
        Class c = Class.forName("javase.reflectBean.User");
 
        // newInstance() 这个方法会调用User这个类的无参数构造方法,完成对象的创建。
 
        // 重点是:newInstance()调用的是无参构造,必须保证无参构造是存在的!
 
        Object obj = c.newInstance();
 
        System.out.println(obj);
 
    }
 
}
 
6、JDBC重点(Class.forName导致类加载)
 
如果你只是希望一个类的静态代码块执行,其它代码一律不执行,可以使用:
 
Class.forName("完整类名");
 
这个方法的执行会导致类加载,类加载时,静态代码块执行。

推荐阅读