菜鳥學Java——Java反射機制(二)
上一篇博文《菜鳥學Java(九)——Java反射機制(一)》裡面,向大家介紹了什麼是Java的反射機制,以及Java的反射機制有什麼用。上一篇比較偏重理論,理論的東西給人講出來總感覺虛無縹緲,還是結合一些例項比較形象具體。那麼今天就結合更多的例項具體說說。
例項一:獲得完整的類名
package reflection.getclassname; //獲得完整的類名 public class GetClassName { public String getNameByClass() { String name = ""; System.out.println("通過類本身獲得物件"); Class UserClass = this.getClass(); System.out.println("獲得物件成功!\n"); System.out.println("通過類物件獲得類名"); name = UserClass.getName(); System.out.println("獲得類名成功!"); return name; } public static void main(String[] args) { GetClassName gcn = new GetClassName(); System.out.println("類名為:"+gcn.getNameByClass()); } }
執行結果:
通過類本身獲得物件 |
例項二:獲得類的屬性
package reflection.getfields; import java.lang.reflect.Field; //獲得類的屬性 public class GetFields { public static void getFieldNames(String className) { try { //獲得類名 Class c = Class.forName(className); //獲得所有屬性 Field[] fds = c.getFields(); for (int i=0; i<fds.length; i++) { String fn = fds[i].getName(); Class tc = fds[i].getType(); String ft = tc.getName(); System.out.println("該屬性的名字為:"+fn+",該屬性的型別為:"+ft); } }catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { GetFields.getFieldNames("reflection.getfields.FieldInfo"); } }
執行結果:
該屬性的名字為:id,該屬性的型別為:java.lang.String 該屬性的名字為:username,該屬性的型別為:java.lang.String |
例項三:獲得類實現的介面
package reflection.getinterfaces; //獲得類實現的介面 public class GetInterfaces { public static void getInterfaces(String className) { try { //取得類 Class cl = Class.forName(className); Class[] ifs = cl.getInterfaces(); for (int i = 0; i<ifs.length;i++) { String IName = ifs[i].getName(); System.out.println("該類實現的介面名字為:"+IName); } }catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { GetInterfaces.getInterfaces("reflection.getinterfaces.Student"); } }
執行結果:
該類實現的介面名字為:reflection.getinterfaces.Person |
例項四:獲得類及其屬性的修飾符
package reflection.getmodifiers;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import reflection.UserInfo;
//獲得類及其屬性的修飾符
public class GetModifiers {
private String username = "liu shui jing";
float f = Float.parseFloat("1.000");
public static final int i = 37;
//獲得類的修飾符
public static String useModifiers(UserInfo ui) {
Class uiClass = ui.getClass();
int m = uiClass.getModifiers();
return Modifier.toString(m);
}
//獲得本類屬性的修飾符
public void checkThisClassModifiers() {
Class tc = this.getClass();
Field fl[] = tc.getDeclaredFields();
for(int i=0;i<fl.length;i++)
{
System.out.println("第"+(i+1)+"個屬性的修飾符為:"+Modifier.toString(fl[i].getModifiers()));
}
}
public static void main(String[] args) {
//獲得類的修飾符
UserInfo ui =new UserInfo();
System.out.println("獲得這個類的修飾符:"+GetModifiers.useModifiers(ui)+"\n");
//獲得本類屬性的修飾符
GetModifiers gm = new GetModifiers();
gm.checkThisClassModifiers();
}
}
執行結果:
獲得這個類的修飾符:public 第1個屬性的修飾符為:private 第2個屬性的修飾符為: 第3個屬性的修飾符為:public static final |
例項五:獲得類的建構函式
package reflection.getconstructor;
import java.lang.reflect.Constructor;
//獲得類的建構函式
public class GetConstructor {
//建構函式一
GetConstructor(int a) {
}
//建構函式二
GetConstructor(int a, String b) {
}
public static void getConstructorInfo(String className) {
try {
//獲得類的物件
Class cl =Class.forName(className);
System.out.println("獲得類"+className+"所有的建構函式");
Constructor ctorlist[] = cl.getDeclaredConstructors();
System.out.println("遍歷建構函式\n");
for(int i =0 ; i<ctorlist.length; i++)
{
Constructor con = ctorlist[i];
System.out.println("這個建構函式的名字為:"+con.getName());
System.out.println("通過建構函式獲得這個類的名字為:"+con.getDeclaringClass());
Class cp[] = con.getParameterTypes();
for (int j=0; j<cp.length; j++)
{
System.out.println("引數 "+j+" 為 "+cp[j]+"\n");
}
}
}catch (Exception e) {
System.err.println(e);
}
}
public static void main(String[] args) {
GetConstructor.getConstructorInfo("reflection.getconstructor.GetConstructor");
}
}
執行結果:
獲得類reflection.getconstructor.GetConstructor所有的建構函式 遍歷建構函式 這個建構函式的名字為:reflection.getconstructor.GetConstructor 通過建構函式獲得這個類的名字為:class reflection.getconstructor.GetConstructor 引數 0 為 int 這個建構函式的名字為:reflection.getconstructor.GetConstructor 通過建構函式獲得這個類的名字為:class reflection.getconstructor.GetConstructor 引數 0 為 int 引數 1 為 class java.lang.String |
例項六:獲得父類
package reflection.getparentclass;
//獲得父類
public class GetParentClass {
public static String getParentClass(UserInfoMore uim) {
//獲得父類
Class uimc = uim.getClass().getSuperclass();
System.out.println("獲得父類的名字為:"+uimc.getName());
return uimc.getName();
}
public static void searchParentClass() {
}
public static void main(String[] args) {
UserInfoMore uim = new UserInfoMore();
System.out.println("成功獲得UserInfoMore的父類:"+GetParentClass.getParentClass(uim));
}
}
執行結果:
獲得父類的名字為:reflection.UserInfo 成功獲得UserInfoMore的父類:reflection.UserInfo |
例項七:獲得類的方法
package reflection.getmethod;
import java.lang.reflect.Method;
//獲得類的方法
public class GetMethod {
public static void getMethods(String className) {
try {
System.out.println("開始遍歷類"+className+".class");
//獲得類名
Class cls = Class.forName(className);
//利用方法獲得所有該類的方法
System.out.println("利用類的getDeclaredMethods獲得類的所有方法");
Method ml[] =cls.getDeclaredMethods();
System.out.println("遍歷獲得的方法陣列\n");
for (int i = 0 ;i<ml.length;i++)
{
System.out.println("開始遍歷第"+(i+1)+"個方法");
Method m = ml[i];
System.out.println("開始獲取方法的變數型別");
Class ptype[] = m.getParameterTypes();
for (int j=0; j<ptype.length; j++)
{
System.out.println("方法引數"+j+"型別為"+ptype[j]);
}
Class gEx[] = m.getExceptionTypes();
for (int j=0 ; j<gEx.length; j++)
{
System.out.println("異常"+j+"為"+ gEx[j]);
}
System.out.println("該方法的返回值型別為:"+m.getReturnType()+"\n");
}
}catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
GetMethod.getMethods("reflection.UserInfo");
}
}
執行結果:
開始遍歷類reflection.UserInfo.class 利用類的getDeclaredMethods獲得類的所有方法 遍歷獲得的方法陣列 開始遍歷第1個方法 開始獲取方法的變數型別 該方法的返回值型別為:class java.lang.String 開始遍歷第2個方法 開始獲取方法的變數型別 該方法的返回值型別為:class java.lang.Integer 開始遍歷第3個方法 開始獲取方法的變數型別 方法引數0型別為class java.lang.String 該方法的返回值型別為:void 開始遍歷第4個方法 開始獲取方法的變數型別 該方法的返回值型別為:class java.lang.String 開始遍歷第5個方法 開始獲取方法的變數型別 方法引數0型別為class java.lang.Integer 該方法的返回值型別為:void 開始遍歷第6個方法 開始獲取方法的變數型別 該方法的返回值型別為:class java.lang.String 開始遍歷第7個方法 開始獲取方法的變數型別 方法引數0型別為class java.lang.String 該方法的返回值型別為:void |
這次例項不少吧,而且這些小例子都比較簡單,相信大家都可以輕鬆秒懂。上面一些例子的程式碼並不是完整的,有些只有一些關鍵程式碼,如果想要完整的程式碼請戳下面的連結。最後祝大家學習愉快!