原則上java不是動態語言的範疇,比如python PHP。但是反射機制的出現使得java在一定意義上實現了動態語言的特徵的。通過反射機制的API可以動態的獲取運行時的類的內部信息或者類的結構信息。並且能夠操作類的實例的對象和方法。
Java反射機制提供如下的功能:
1.在運行時判斷任意一個對象的所屬的類。
2.在運行時創建任何一個類的對象實例。
3.運行時獲取任意一個類的所有的屬性和方法(包括私有屬性和方法)。
4在運行時調用和操作任意類的屬性和方法。
下面是我的運行demo:
首先新建一個person類
package TestReflection;
/**
* @author 善水 E mail:[email protected]
* @version 創建時間:Nov 1, 2017 10:14:50 PM
* 類說明
*/
public class Person {
public String name = "王雲";
public int age = 22;
private String sex = "男士";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Person(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public void show() {
System.out.println("我叫"+name+",我是一個"+sex+",今年"+age+"歲 了.");
}
public void display() {
System.out.println("我是一個人!");
}
public void display1(String nation) {
System.out.println("我是一個"+nation+"人");
}
}
後面是
反射測試代碼:
package TestReflection;
/**
* @author 善水 E mail:[email protected]
* @version 創建時間:Nov 1, 2017 10:18:12 PM
* 類說明
*/
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
public class TestRelf {
// 在不使用反射機制之前的面向對象的基本類操作
@Test
public void test1(){
Person p1 = new Person();
p1.setName("劉德華");
p1.setAge(45);
p1.setSex("男士");
p1.display();
p1.show();
}
// 使用java的反射機制實現對運行時類的操作
@Test
public void test2() throws Exception {
Class<Person> pClass = Person.class;
// 創建類的實例
Person person = pClass.newInstance();
// 獲取屬性
Field fname = pClass.getField("name");
fname.set(person, "周星馳");
Field fage = pClass.getField("age");
fage.set(person, 55);
Method method1 = pClass.getMethod("display1", String.class);
method1.invoke(person, "HK");
Method method2 = pClass.getMethod("setName", String.class);
method2.invoke(person, "張學友");
// 重點:與封裝性的原則對立,private的屬性獲取
//
// Field fsex = pClass.getField("sex");錯誤:因爲聲明 的是私有變量
// fsex.set(person, "nanshi");
// 以下的就會運行成功
Field fsex = pClass.getDeclaredField("sex");
fsex.setAccessible(true);
fsex.set(person, "女士");
person.show();
// person.display();
}
}
以上就是反射機制的最基本問題,後面的很多操作都基於這一思想的實現。在上面的例子中需要注意反射機制對類私有屬性和方法的操作。這與面向對象所學的封裝性有一點出入。