一種能力,並能根據自身行爲的狀態和結果,調整或修改
應用所描述行爲的狀態和相關的語義。
看這個概念很暈的
反射機制的作用:
1.反編譯 .class ---> .java
2.通過反射機制訪問java對象的屬性,方法,構造方法等
反射機制的好處:解耦合,降低耦合度,提高安全性,可維護性
三階段:
1.Source 源碼階段 類加載器ClassLoader加載進內存,就成了對象
2.Class類階段 String name Field[] fieldd 字段 Method[] methods 方法 Constructor[] cons構造器 newInstance()對象
3.runtime階段 創建對象 調用方法
獲取Class對象的三種方法:
1.反射 Class.forName("");
2.類名.class
3.obj.getClass();
Demo3:
/*
*Class對象能幹什麼?
* 獲取對象
* 創建對象
* 獲取字段
* 獲取方法
* 獲取構造器
*/
ReflectDemo3.java:
public class ReflectDemo3 {
publicstatic void main(String[] args) throws Exception {
//獲取對象
Classclazz = Class.forName("com.reflect.Demo3.Student");
Objectobj = clazz.newInstance();
// System.out.println(obj+"asdfghj");
//獲取所有公共字段(getFields())
Field[]fields = clazz.getFields(); //只能得到類公共的字段
for(Field field : fields) {
// System.out.println(field.getName());
}
//獲取所有字段(getDeclaredFields())
Field[]fields2 = clazz.getDeclaredFields();
for(Field field : fields2) {
// System.out.println(field.getName());
}
//獲取某個字段1
Fieldsex = clazz.getField("sex");
sex.set(obj,1);
// System.out.println(obj);
//獲取某個字段2
Fieldname = clazz.getDeclaredField("name");
name.setAccessible(true); //暴力反射,取消訪問的權限檢查(查詢field)
name.set(obj,"xxx");
// System.out.println(obj);
//獲取方法1
Method[]methods = clazz.getMethods(); //獲取公共的方法,包括父類的
for(Method method : methods) {
// System.out.println("method:"+method.getName());
}
//獲取方法2
Method[]declaredMethods = clazz.getDeclaredMethods(); //獲取本類定義的所有方法,沒有父類的
for(Method method : declaredMethods) {
System.out.println("method:"+method.getName()+"*****");
}
//獲取構造器
Constructor[]cons = clazz.getConstructors();
for(Constructor constructor : cons) {
System.out.println(constructor.getName());//以字符串形式返回此構造方法的名稱。
System.out.println(constructor.getModifiers());//獲取修飾符 返回值int類型
System.out.println(Modifier.toString(constructor.getModifiers()));//獲取修飾符
}
}
}
Student.java:
public class Student {
privateString name;
privateint age;
publicint sex; //公有的
publicString getName() {
returnname;
}
publicvoid setName(String name) {
this.name= name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age= age;
}
publicint getSex() {
returnsex;
}
publicvoid setSex(int sex) {
this.sex= sex;
}
@Override
publicString toString() {
return"Student [age=" + age + ", name=" + name + ",sex=" + sex + "]";
}
publicStudent(String name, int age, int sex) {
this.name= name;
this.age= age;
this.sex= sex;
}
publicStudent() { }
publicStudent(String name) {
this.name= name;
}
}