Java反射機制指的是在程序運行時,對於任何一個類,都可以知道這個類的屬性和方法。對於任何一個對象,都可以任意調用他的任意方法和屬性。這增加了java語言的動態性。
說白了就是程序可以在運行時查看自己的狀態和行爲,並且根據狀態和行爲進行及時的調整,使程序運行的更加靈活。
Java反射機制主要提供了一下幾種功能:
- 在運行時判斷任意一個對象所屬的類。
- 在運行時創建一個類的對象
- 在運行時判斷任意一個類的成員變量和方法
- 在運行時調用任意一個對象的方法
1. 反射的作用:
1.反編譯:.class->.java
2.訪問類的方法,屬性,構造方法
2.java中反射相關的類:
1.java.lang.Class;
2.java.lang.reflect.Constructor;
3.java.lang.reflect.Field;
4.java.lang.reflect.Method;
5.java.lang.reflect.Modifier;
3.反射的具體實現方法,假設是Employe類型:
//第一種方式:
Classc1 = Class.forName("Employee");
//第二種方式:
//java中每個類型都有class 屬性.
Classc2 = Employee.class;
//第三種方式:
//java語言中任何一個java對象都有getClass 方法
Employeee = new Employee();
Classc3 = e.getClass(); //c3是運行時類 (e的運行時類是Employee)
創建實例對象
通過反射來生成實例對象有如下兩種方式。
1.使用Class對象的newInstance()方法來創建該Class對應類的實例,這種方式要求該Class對象的對應類有默認構造器,而執行newInstance()時實際上是利用默認構造器來創建該類的實例。
代碼示例:Class clazz=Person.class;
Object obj=clazz.newInstance();2.先使用Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來創建該Class對象對應類的實例。通過這種方式可以選擇使用指定的構造器來創建實例。
代碼示例:Class clazz=Person.class;
Constructor constructor=clazz.getConstructor(String.class);
Object obj=constructor.newInstance();
先看獲取所有的屬性的寫法
package jdbc1101;
//獲取某個類的全部屬性
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class TestModifier {
public static void main(String[] args) throws ClassNotFoundException {
//獲取整個類
Class<?> c = Class.forName("java.lang.Integer");
//獲取所有的屬性?
Field[] fs = c.getDeclaredFields();
//定義可變長的字符串,用來存儲屬性
StringBuffer sb = new StringBuffer();
//通過追加的方法,將每個屬性拼接到此字符串中
//最外邊的public定義
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
//裏邊的每一個屬性
for(Field field:fs){
sb.append("\t");//空格
sb.append(Modifier.toString(field.getModifiers())+" ");//獲得屬性的修飾符,例如public,static等等
sb.append(field.getType().getSimpleName() + " ");//屬性的類型的名字
sb.append(field.getName()+";\n");//屬性的名字+回車
}
sb.append("}");
System.out.println(sb);
}
}
package jdbc1101;
//獲取特定的屬性,設置私有的屬性
import java.lang.reflect.Field;
import java.util.Date;
public class Test {
public static void main(String[] args) throws Exception{
//獲取類
Class c =Dog.class;
//獲取id屬性
Field idF = c.getDeclaredField("id");
//實例化這個類賦給o
Object o = c.newInstance();
//打破封裝
idF.setAccessible(true); //使用反射機制可以打破封裝性,導致了java對象的屬性不安全。
//給o對象的id屬性賦值"110"
idF.set(o,110); //set
//get
System.out.println(idF.get(o));
}
}