GGYU

reflection 본문

프로그래밍/JAVA

reflection

GANADARA 2018. 7. 19. 22:34


예제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
Comments