反射的基石是 Class 類,Class 類代表的是 java 源文件通過(guò)編譯后得到的字節(jié)碼,
獲得 Class 類型 的幾種方法:
1. 類名.class
2. 對(duì)象名.getClass()
3. Class.forName("類路徑")
構(gòu)造方法的反射:
package test;
import java.lang.reflect.Constructor;
/**
* -----------------------------------------
* @描述 反射基礎(chǔ)
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-24 <p>
* -----------------------------------------
*/
public class ReflectApp {
public static void main(String[] args){
try {
//取得Class
Class<?> clazz = Class.forName("java.lang.Integer");
//取得類中參數(shù)為String類型的構(gòu)造器
Constructor<?> constructor = clazz.getConstructor(String.class);
//使用構(gòu)造器創(chuàng)建一個(gè)實(shí)例對(duì)象
Object obj = constructor.newInstance("10");
//打印結(jié)果
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
后臺(tái)打印輸出結(jié)果:
10
成員變量的反射:
package test;
import java.lang.reflect.Field;
/**
* -----------------------------------------
* @描述 反射基礎(chǔ)
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-24 <p>
* -----------------------------------------
*/
public class ReflectApp {
public static void main(String[] args){
try {
//創(chuàng)建一個(gè)Person實(shí)例對(duì)象
Person person = new ReflectApp().new Person();
//取得Class
Class<?> clazz = person.getClass();
/******** 通過(guò)反射訪問(wèn) public 權(quán)限的屬性變量 ********/
//取得字段的屬性名
Field age = clazz.getDeclaredField("age");
//設(shè)置該屬性的值
age.set(person, 22);
/******* 通過(guò)反射訪問(wèn) protected 權(quán)限的屬性變量 *******/
Field mail = clazz.getDeclaredField("mail");
mail.set(person, "fancydeepin@yeah.net");
/******** 通過(guò)反射訪問(wèn) private 權(quán)限的屬性變量 ********/
Field name = clazz.getDeclaredField("name");
//private修飾的變量不能直接訪問(wèn),如需訪問(wèn)必須要將setAccessible的值設(shè)置成true,也就是強(qiáng)制訪問(wèn),或者說(shuō)是暴力訪問(wèn)
name.setAccessible(true);
name.set(person, "fancy");
System.out.println(person);
} catch (Exception e) {
e.printStackTrace();
}
}
//內(nèi)部類
public class Person {
public int age;
private String name;
protected String mail;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
@Override
public String toString() {
return "Name is:" + name + ",\t Age is:" + age + ",\t Mail is:" + mail;
}
}
}
后臺(tái)打印輸出結(jié)果:
Name is:fancy, Age is:22, Mail is:fancydeepin@yeah.net
成員方法的反射:
package test;
import java.lang.reflect.Method;
/**
* -----------------------------------------
* @描述 反射基礎(chǔ)
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-24 <p>
* -----------------------------------------
*/
public class ReflectApp {
public static void main(String[] args){
try {
//取得Class
Class<?> clazz = Class.forName("test.ReflectApp");
//取得方法
Method method = clazz.getDeclaredMethod("print", String.class);
//調(diào)用該方法
method.invoke(clazz.newInstance(), "fancy");
} catch (Exception e) {
e.printStackTrace();
}
}
public void print(int arg){
System.out.println("Arg is int, value is " + arg);
}
public void print(String arg){
System.out.println("Arg is String, value is " + arg);
}
}
后臺(tái)打印輸出結(jié)果:
Arg is String, value is fancy
For a simple example:
題:ArrayList<Integer> list = new ArrayList<Integer>(); 在這個(gè)泛型為 Integer 的 ArrayList 中存放一個(gè) String 類型的對(duì)象。
個(gè)人分析:泛型的類型檢查只存在編譯期間,運(yùn)行期間并不存在泛型類型,可以用反射來(lái)實(shí)現(xiàn)題設(shè)要求
package examination.topic_04;
import java.lang.reflect.Method;
import java.util.ArrayList;
/**
* -----------------------------------------
* @描述 測(cè)試類
* @作者 fancy
* @郵箱 fancydeepin@yeah.net
* @日期 2012-8-24 <p>
* -----------------------------------------
*/
/**
* TOPIC:ArrayList<Integer> list = new ArrayList<Integer>(); 在這個(gè)泛型為Integer的ArrayList中存放一個(gè)String類型的對(duì)象。
*/
public class TestApp {
public static void main(String[] args){
/**
* 泛型的類型檢查只存在編譯期間,運(yùn)行期間并不存在泛型類型,可以用反射來(lái)實(shí)現(xiàn)題設(shè)要求
*/
try {
ArrayList<Integer> list = new ArrayList<Integer>();
Method add = ArrayList.class.getDeclaredMethod("add", Object.class);
add.invoke(list, "fancy");
System.out.println(list.get(0));
} catch (Exception e) {
e.printStackTrace();
}
}
}
后臺(tái)打印輸出結(jié)果:
fancy