反射:使用類的字節(jié)碼所做的一系列操作。
源代碼編譯過后的字節(jié)碼文件(.class文件),在java中也被視為對象,這個(gè)字節(jié)碼對象屬于Class類型。
一、獲取字節(jié)碼對象
例:
// 1. Student.java
package 獲取字節(jié)碼對象;
import java.io.Serializable;
public class Student implements Serializable{
private int stuid;
private String name;
private int stuage;
public String toString(){
return "我的名字叫:"+name+",我的年齡為:"
+stuage+",我的學(xué)號是:"+stuid;
}
public void study(){
System.out.println("我們都在認(rèn)真學(xué)習(xí)");
}
public void study(String name,int age){
System.out.println(name+"同學(xué),"+age
+"歲了,也在認(rèn)真學(xué)習(xí)");
}
public Student(int stuid, String name, int stuage) {
this.stuid = stuid;
this.name = name;
this.stuage = stuage;
}
public Student() {
System.out.println("一個(gè)學(xué)員被創(chuàng)建了");
}
public int getStuid() {
return stuid;
}
public void setStuid(int stuid) {
this.stuid = stuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStuage() {
return stuage;
}
public void setStuage(int stuage) {
this.stuage = stuage;
}
}
// 2. Test1.java
package 獲取字節(jié)碼對象;
public class Test1 {
//Class
public static void main(String[] args) {
try {
//第一種方式,通過某個(gè)路徑得到這個(gè)路徑下的字節(jié)碼對象
Class c1 = Class.forName("獲取字節(jié)碼對象.Student");
System.out.println(c1.getName());
//第二種方式,通過類名.class屬性也可以獲得這個(gè)類的字節(jié)碼對象
//前提,這個(gè)類要和當(dāng)前類同一級目錄.
Class c2 = Student.class;
System.out.println(c2.getSuperclass().getName());
//第三種方式,可以直接通過對象,來獲取其對應(yīng)的字節(jié)碼對象
Student stu = new Student();
Class c3 = stu.getClass();
System.out.println(c3.getName());
//一些其他原始數(shù)據(jù)類型的字節(jié)碼的獲取方式
Class c4 = int.class;
Class c5 = Integer.TYPE;
Class c6 = Integer.class;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果
二、調(diào)用字節(jié)碼中的方法
例:
package 調(diào)用字節(jié)碼中的方法;
import java.lang.reflect.Constructor;
import 獲取字節(jié)碼對象.Student;
public class Test1 {
public static void main(String[] args) {
try {
Class c1 = Class.forName("獲取字節(jié)碼對象.Student");
// 調(diào)用字節(jié)碼中的構(gòu)造方法
Student stu = (Student)c1.newInstance();
stu.study();
System.out.println(stu);
//getConstructor是用來獲取字節(jié)碼中的構(gòu)造方法對象
//... 代表里面可以傳入 數(shù)組,或者是單個(gè)變量,或者是多個(gè)變量
Class[] ctype = {int.class,String.class,int.class};
Constructor<Student> constr
= c1.getConstructor(ctype);
Student stu1 = constr.newInstance(1,"lisi",20);
System.out.println(stu1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果