在jdk的配置環境中 從倆個地方體現出:一個是XML解析 另一個是實體類 而實體類則需要運用反射
jdk裏面jre轉譯:是將.java文件轉化爲.class的文件
而今天我們說的是反射 它是將.class文件轉爲.java文件
1. 什麼是反射?
反射是java語言中的一種機制,通過這種機制可以動態的實例化對象、讀寫屬性、調用方法2.反射3大作用
實例化對象
c.newInstance() --實例化
動態調用方法
Method m; --找到方法
m.invoke --調用
讀寫屬性
Field set/get --設置值和獲取 Field f=p.getDeclaredField("屬性名"); 得到單個屬性 Field [] fall=person.getDeclaredFields(); 得到全部的屬性
3.如何運行反射?
比如: 新建實體類Person,設置好三個字段:pid pname psex ,通過反射得到該類所有的屬性和方法,父類,並調用方法(無參無返回,無參有返回,有參數無返回,有參數有返回).
一切反射相關的代碼都從獲得類對象開始 以下有三個獲取類對象的方法
1 Class.forName(完整類名) --(我們最常用的一種)
2 類名.class
3 對象.getClass()
創建實體類Person 寫4個簡單方法
public class Person{
//implements Reflect
/**
* id
*/
private String pid;
/**
* 姓名
*/
private String pname;
/**
* 性別
*/
private String psex;
//無參無返回
public void m1() {
System.out.println("m1");
}
//無參有返回
public String m2() {
return "m2";
}
//有參數無返回
public void m3(String pid, String pname, String psex) {
System.out.println(pid+pname+psex);
}
//有參數有返回
public String m4(String pid, String pname, String psex) {
return pid+pname+psex;
}
}
寫反射的內容 讀寫屬性
//得到類對象
Class person=Class.forName("com.list.reflect.Person");
//實例化對象
Object p=null;
//屬性 Field f=p.getDeclaredField("pid"); 得到單個屬性
//得到Person全部的屬性 是一個數組getDeclaredFields 類對象獲取全部的屬性
Field [] fall=person.getDeclaredFields();
for (Field f : fall) {
//設置可以訪問 千萬別忘記啦
f.setAccessible(true);
//實例化對象
p=person.newInstance();
//賦值
if("pid".contains(f.getName())) {
f.set(p, "001");
}
else if("pname".contains(f.getName())) {
f.set(p, "張張");
}
else if("psex".contains(f.getName())) {
f.set(p, "女");
}
//得到全部的屬性
System.out.println(f.getName());
}
調用方法
Method [] method=person.getDeclaredMethods();
for (Method m : method) {
p=person.newInstance();
if("m1".contains(m.getName())) {
m.invoke(p, null);
//System.out.println(m.getParameterTypes());
}
if("m2".contains(m.getName())) {
System.out.println(m.invoke(p, null));
}
if("m3".contains(m.getName())) {
System.out.println(m.invoke(p, "010","張家人","男"));
}
if("m4".contains(m.getName())) {
System.out.println(m.invoke(p, "003","王jk","男"));
}
//得到所有的方法
System.out.println(m.getName());
}
總結:感覺自己懂得反射的東西並不是很深,需要在深入的去思考和鑽研,今天就寫了一些簡單的代碼,以後知道的話會補上一些遺漏的知識點的 ,以下再附上一張關於反射的知識點,從一位大神那裏納萊的 ,嘿嘿,就這樣吧!