GGYU
reflection 본문
예제1.
package com.javacodegeeks.snippets.core;
import java.lang.reflect.Field;
public class GenericCopy {
/**
* Deep-copies the values from one object to the other
*
*/
public static void main(String[] args) {
A a1 = new A(1, 2, new B("string 1", 10));
A a2 = new A(3, 4, new B("string 2", 20));
System.out.println("a1 is :" + a1);
System.out.println("a2 is :" + a2);
copyFields(a1, a2);
System.out.println("After copying...");
System.out.println("a1 is :" + a1);
System.out.println("a2 is :" + a2);
}
public static <T> void copyFields(T from, T to) {
for (Field f : from.getClass().getFields()) {
try {
if (isPrimitivish(f.getType())) {
f.set(to, f.get(from));
} else {
copyFields(f.get(from), f.get(to));
}
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
private static boolean isPrimitivish(Class c) {
return c.isPrimitive() || c == String.class || c == Boolean.class
|| c == Byte.class || c == Short.class || c == Character.class
|| c == Integer.class || c == Float.class || c == Double.class
|| c == Long.class;
}
}
class A {
public int x;
public int y;
public B bObj;
public A(int x, int y, B b) {
this.x = x;
this.y = y;
this.bObj = b;
}
@Override
public String toString() {
return "[" + this.x + "," + this.y + "," + this.bObj.toString() + "]";
}
}
class B {
public String str;
public int z;
public B(String str, int z) {
this.str = str;
this.z = z;
}
@Override
public String toString() {
return "[" + this.str + "," + this.z + "]";
}
}
예제2.
public class Album {
Integer id;
String title;
String nation;
public Integer getId() {
return id;
}
public void setId(Integer album_id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getNation() {
return nation;
}
public void setNation(String nation_cd) {
this.nation = nation;
}
}
public String generateJsonAndToString(Object obj){
JSONObject json = new JSONObject();
char[] methodNameArr = null;
String methodName = null;
Method method = null;
for (Field field : obj.getClass().getDeclaredFields()){
// reflection을 이용해서 멤버변수의 이름을 구한다.
//field.setAccessible(true) 하면 필드면 필드명 가져올수 있음.
//field.get(obj); //obj안에 필드명의 값을 가져옴
//field.getName() //필드명
//field.set(newObj,field.get(obj)) 구 object에서 new object에 값 대입
try {
methodNameArr = field.getName().toCharArray();
//메소드 이름이 멤버변수 이름의 첫 알파벳이 대문자로 바뀐 것이라고 가정하고 필드이름을 구해서 넣어준다.
methodNameArr[0] = (char)((methodNameArr[0] - 'a') + 'A');
// 첫 알파벳을 대문자로 바꿔준다.
methodName = "get" + new String(methodNameArr);
// 앞에 get을 추가해서 getMethod가 되도록 한다.
try {
method = obj.getClass().getMethod(methodName);
// 메소드 오브젝트에 reflection을 이용해서 메소드객체를 담는다.
json.put(field.getName(), method.invoke(obj));
// 메소드 실행
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return json.toString(); json 스트링 형태로 반환.
}
'프로그래밍 > JAVA' 카테고리의 다른 글
시저암호화 (0) | 2019.04.21 |
---|---|
console 입력 (0) | 2019.04.21 |
object 전송 (0) | 2018.07.19 |
collection sort (0) | 2018.07.19 |
체인코드 (0) | 2018.07.19 |