JAVA反射機制的應用場景
阿新 • • 發佈:2019-02-04
Member類:
ReflectionDemo類:
MemberView類:package test; public class Member { private String username; private String password; private String truename; private String nickname; private String gender; private int age; @Override public String toString(){ return (username==null?"":"username:" + username) + (password==null?"":" password:" + password) + (truename==null?"":" truename:" + truename) + (nickname==null?"":" nickname:" + nickname) + (gender==null?"":" gender:" + gender) + " age:" + age; } }
package test; public class MemberView { private String username; private String password; private String truename; private String nickname; private String gender; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getTruename() { return truename; } public void setTruename(String truename) { this.truename = truename; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
ReflectionDemo類:
package test; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * Java反射機制測試 * @author Tomorrow * */ public class ReflectionDemo { /** * @param args */ public static void main(String[] args) { //測試1 test1(); //測試2 test2(); } public static void test1(){ MemberView fromObject = new MemberView(); fromObject.setUsername("sunchenbin"); fromObject.setPassword("111111"); fromObject.setAge(21); fromObject.setGender("男"); fromObject.setNickname("墨白"); String[] fields = new String[]{}; // 沒有設定屬性,預設去對比兩個物件 //String[] fields = new String[]{"username","password","gender"}; try{ // 將一個物件轉換成另一個物件,並把指定的屬性值傳遞給這個物件,
// 如果不指定預設去匹配兩個物件的屬性,存在則賦值
Member member = (Member) constructObject(fromObject,new Member(),fields);
System.out.println(member.toString());
// 執行結果:username:sunchenbin password:111111 nickname:墨白 gender:男 age:21
}catch (Exception e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void test2(){
String className = "test.ReflectionDemo";
String methodName = "eachOrtherToAdd";
String[] paramTypes = new String[]{"Integer","Double","int"};
String[] paramValues = new String[]{"1","4.3321","5"};
// 動態載入物件並執行方法
initLoadClass(className, methodName, paramTypes, paramValues);
}
private static Object constructObject(Object fromObject,Object toObject,String[] fields) throws Exception{
// 資料來源的class
Class fromClass = fromObject.getClass();
// 目標的class
Class toClass = toObject.getClass();
for(String field:fields){
try{
// 獲取fromClass的Field
Field fromField= fromClass.getDeclaredField(field);
fromField.setAccessible(true);
// 從fromClass中獲取屬性的值
Object fromValue = fromField.get(fromObject);
// 獲取toClass的Field
Field toField = toClass.getDeclaredField(field);
toField.setAccessible(true);
// 將fromClass中該屬性的值設定給toClass中的該屬性
toField.set(toObject, fromValue);
}catch (Exception e) {
System.out.println(field+"屬性不存在");
// TODO: handle exception
}
}
// 如果沒有傳遞屬性過來,那麼預設對比from和to中的屬性,存在的進行賦值操作
if(fields.length == 0){
Field[] fromDeclaredFields = fromClass.getDeclaredFields();
Field[] toDeclaredFields = toClass.getDeclaredFields();
List<String> fromList = new ArrayList<String>();
List<String> toList = new ArrayList<String>();
// 取出from中所有field
for (Field field : fromDeclaredFields){
field.setAccessible(true);
fromList.add(field.getName());
}
// 取出to中所有field
for (Field field : toDeclaredFields){
field.setAccessible(true);
toList.add(field.getName());
}
// 迴圈from屬性list
for (String name : fromList){
// to中是否包含該屬性
if(toList.contains(name)){
// 包含先進行取值
Field fromDeclaredField = fromClass.getDeclaredField(name);
fromDeclaredField.setAccessible(true);
Object value = fromDeclaredField.get(fromObject);
// 進行賦值操作
Field toDeclaredField = toClass.getDeclaredField(name);
toDeclaredField.setAccessible(true);
toDeclaredField.set(toObject, value);
}
}
}
return toObject;
}
public double eachOrtherToAdd(Integer one,Double two,Integer three){
return one+two+three;
}
@SuppressWarnings("rawtypes")
private static void initLoadClass(String className,String methodName,String[] paramTypes,String[] paramValues){
try{
// 根據calssName得到class物件
Class cls = Class.forName(className);
// 例項化物件
Object obj = cls.newInstance();
// 根據引數型別陣列得到引數型別的Class陣列
Class[] parameterTypes = constructTypes(paramTypes);
// 得到方法
Method method = cls.getMethod(methodName, parameterTypes);
// 根據引數型別陣列和引數值陣列得到引數值的obj陣列
Object[] parameterValues = constructValues(paramTypes,paramValues);
// 執行這個方法並返回obj值
Object returnValue = method.invoke(obj, parameterValues);
System.out.println("測試結果2:"+returnValue);
}catch (Exception e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static Object[] constructValues(String[] paramTypes,String[] paramValues){
Object[] obj = new Object[paramTypes.length];
for (int i = 0; i < paramTypes.length; i++){
if(paramTypes[i] != null && !paramTypes[i].trim().equals("")){
if ("Integer".equals(paramTypes[i]) || "int".equals(paramTypes[i])){
obj[i] = Integer.parseInt(paramValues[i]);
}else if ("Double".equals(paramTypes[i]) || "double".equals(paramTypes[i])){
obj[i] = Double.parseDouble(paramValues[i]);
}else if ("Float".equals(paramTypes[i]) || "float".equals(paramTypes[i])){
obj[i] = Float.parseFloat(paramValues[i]);
}else{
obj[i] = paramTypes[i];
}
}
}
return obj;
}
@SuppressWarnings("rawtypes")
private static Class[] constructTypes(String[] paramTypes){
Class[] cls = new Class[paramTypes.length];
for (int i = 0; i < paramTypes.length; i++){
if(paramTypes[i] != null && !paramTypes[i].trim().equals("")){
if ("Integer".equals(paramTypes[i]) || "int".equals(paramTypes[i])){
cls[i] = Integer.class;
}else if ("Double".equals(paramTypes[i]) || "double".equals(paramTypes[i])){
cls[i] = Double.class;
}else if ("Float".equals(paramTypes[i]) || "float".equals(paramTypes[i])){
cls[i] = Float.class;
}else{
cls[i] = String.class;
}
}
}
return cls;
}
}