java反射機制獲取 成員變數名字
阿新 • • 發佈:2018-12-10
package jp.co.nextep.mms.webapp.common.token; public class BeanDto { private Integer id; private String name; private String age; private String sex; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } } package jp.co.nextep.mms.webapp.common.token; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class BeanUtil { public void getFile(Object dto) { Class dtoClass = dto.getClass();//通過例項獲得類名 System.out.println(dtoClass.toString()); Constructor[] cons = dtoClass.getConstructors();//獲得構造子,用於例項化物件 /* getFields():獲得某個類的所有的公共(public)的欄位,包括父類中的欄位。 getDeclaredFields():獲得某個類的所有宣告的欄位,即包括public、private和proteced,但是不包括父類的申明欄位。*/ Field[] field = dtoClass.getDeclaredFields();//獲取欄位名稱,存放到陣列 Object[] arg = { 3, "趙繼彬", "20", "男", "男" }; Class[] ddd = new Class[arg.length];//構造Class陣列,用於存放參數型別 try { for (int j = 0; j < cons.length; j++) { Method method; Object ob = cons[j].newInstance(null);//構造例項相當於new Object() for (int i = 0; i < field.length; i++) {//根據欄位陣列的長度,構造set方法 String stt = field[i].getName(); String fisrt = stt.substring(0, 1);//取第一個字母 String upFisrt = fisrt.toUpperCase();//將第一個字母轉換為大寫 String seter = "set" + upFisrt + stt.substring(1);//合成set方法 ddd[i] = arg[i].getClass();//指定呼叫方法的型別 method = dtoClass.getMethod(seter, ddd[i]);//通過方法名獲取dtoClass的方法,引數型別為ddd[i]的型別 method.invoke(ob, arg[i]);//通過dtoClass的例項呼叫seter方法,arg[i]為引數值 System.out.println(stt); System.out.println(seter); System.out.println(ddd[i]); } for (int i = 0; i < field.length; i++) { String stt = field[i].getName(); String fisrt = stt.substring(0, 1); String upFisrt = fisrt.toUpperCase(); String geter = "get" + upFisrt + stt.substring(1); method = dtoClass.getMethod(geter, null); System.out.println(stt + "==" + method.invoke(ob, null)); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] a) { BeanUtil bu = new BeanUtil(); BeanDto dto = new BeanDto(); bu.getFile(dto); } } //以下是別人的 到此就結束了 package fanshe; import java.lang.reflect.Constructor; /* * 通過Class物件可以獲取某個類中的:構造方法、成員變數、成員方法;並訪問成員; * * 1.獲取構造方法: * 1).批量的方法: * public Constructor[] getConstructors():所有"公有的"構造方法 public Constructor[] getDeclaredConstructors():獲取所有的構造方法(包括私有、受保護、預設、公有) * 2).獲取單個的方法,並呼叫: * public Constructor getConstructor(Class... parameterTypes):獲取單個的"公有的"構造方法: * public Constructor getDeclaredConstructor(Class... parameterTypes):獲取"某個構造方法"可以是私有的,或受保護、預設、公有; * * 呼叫構造方法: * Constructor-->newInstance(Object... initargs) */ public class Constructors { public static void main(String[] args) throws Exception { //1.載入Class物件 Class clazz = Class.forName("fanshe.Student"); //2.獲取所有公有構造方法 System.out.println("**********************所有公有構造方法*********************************"); Constructor[] conArray = clazz.getConstructors(); for(Constructor c : conArray){ System.out.println(c); } System.out.println("************所有的構造方法(包括:私有、受保護、預設、公有)***************"); conArray = clazz.getDeclaredConstructors(); for(Constructor c : conArray){ System.out.println(c); } System.out.println("*****************獲取公有、無參的構造方法*******************************"); Constructor con = clazz.getConstructor(null); //1>、因為是無參的構造方法所以型別是一個null,不寫也可以:這裡需要的是一個引數的型別,切記是型別 //2>、返回的是描述這個無參建構函式的類物件。 System.out.println("con = " + con); //呼叫構造方法 Object obj = con.newInstance(); // System.out.println("obj = " + obj); // Student stu = (Student)obj; System.out.println("******************獲取私有構造方法,並呼叫*******************************"); con = clazz.getDeclaredConstructor(char.class); System.out.println(con); //呼叫構造方法 con.setAccessible(true);//暴力訪問(忽略掉訪問修飾符) obj = con.newInstance('男'); } }