CodeGym /Java Course /๋ชจ๋“ˆ 2: ์ž๋ฐ” ์ฝ”์–ด /๏ปฟ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

๏ปฟ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

๋ชจ๋“ˆ 2: ์ž๋ฐ” ์ฝ”์–ด
๋ ˆ๋ฒจ 17 , ๋ ˆ์Šจ 1
์‚ฌ์šฉ ๊ฐ€๋Šฅ

java.lang.reflect.Field ํด๋ž˜์Šค

Field ํด๋ž˜์Šค ๋Š” ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹จ์ผ ํ•„๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๋ฐ ๋™์  ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Field๋Š” get ๋˜๋Š” set ์•ก์„ธ์Šค ์ž‘์—… ์ค‘์— ํ™•์žฅ ์œ ํ˜• ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ถ•์†Œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด IllegalArgumentException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Field ๊ฐ์ฒด๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋จผ์ € ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.


public class Person {
    private String name;
    private int age;
    
    public boolean isMale;
    
    protected String address;
    
    public static final int MAX_AGE = 120;
    public static final int MIN_AGE = 0;
}

๋‹ค์Œ์€ ํ•ด๋‹น ํด๋ž˜์Šค๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.


public class Main {
    public static void main(String[] args) {
        Field[] fields = Person.class.getDeclaredFields();
        List<Field> actualFields = getFieldNames(fields);
        System.out.println(actualFields);
    }

    static List<Field> getFieldNames(Field[] fields) {
        return List.of(fields);
    }
}

์ด๊ฒƒ์ด ๋‚˜์ค‘์— ์ž‘์—…ํ•  ํด๋ž˜์Šค์˜ ํ•„๋“œ ๋ชฉ๋ก์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[๋น„๊ณต๊ฐœ java.lang.String com.company.Person.name, ๋น„๊ณต๊ฐœ int com.company.Person.age, ๊ณต๊ฐœ ๋ถ€์šธ com.company.Person.isMale, ๋ณดํ˜ธ๋œ java.lang.String com.company.Person.address, ๊ณต๊ฐœ ์ •์  ์ตœ์ข… int com.company.Person.MAX_AGE, ๊ณต๊ฐœ ์ •์  ์ตœ์ข… int com.company.Person.MIN_AGE]

์ด์ œ ์ด ๋ฐ์ดํ„ฐ๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค. Field ํด๋ž˜์Šค ์˜ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค .

๋ฐฉ๋ฒ• ์„ค๋ช…
getType() ์ด ํ•„๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ์˜ ์„ ์–ธ๋œ ์œ ํ˜•์„ ์‹๋ณ„ํ•˜๋Š” ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ํ•„๋“œ๋ฌผ์ฒด.
getAnnotatedType() ๋ฐ˜ํ™˜์ฃผ์„ ์œ ํ˜•์ด Field๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ์˜ ์„ ์–ธ๋œ ์œ ํ˜•์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜•์˜ ์‚ฌ์šฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.
getGenericType() ๋ฐ˜ํ™˜์œ ํ˜•this๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ์˜ ์„ ์–ธ๋œ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒดํ•„๋“œ๋ฌผ์ฒด.
getName() ์ด ํ‘œ์‹œ๋˜๋Š” ํ•„๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ํ•„๋“œ๋ฌผ์ฒด.
getModifiers() ์ด ํ•ญ๋ชฉ์ด ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ์— ๋Œ€ํ•œ Java ์–ธ์–ด ์ˆ˜์ •์ž๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” int๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ํ•„๋“œ๋ฌผ์ฒด.
getAnnotations() ์ด ํ•„๋“œ์— ๋Œ€ํ•œ ์ฃผ์„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„์ด ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

getType(), getName() ๋ฐ getModifiers() ๋ฉ”์„œ๋“œ

getType() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ์˜ ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•ด ๋ด…์‹œ๋‹ค:


static void printTypes(List<Field> fields){
      fields.forEach(e -> System.out.println(e.getType()));
  }

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค java.lang.String
int
๋ถ€์šธ
ํด๋ž˜์Šค java.lang.String
int
int

์ด์ œ ํด๋ž˜์Šค์— ํ•„๋“œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


static void printTypesAndNames(List<Field> fields){
   fields.forEach(e -> System.out.printf("Field type - %s\nField name - %s\n\n", e.getType(), e.getName()));
}

์ด์ œ ๊ฒฐ๊ณผ๊ฐ€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ•„๋“œ ์œ ํ˜• - class java.lang.String
ํ•„๋“œ ์ด๋ฆ„ - name

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - age

ํ•„๋“œ ์œ ํ˜• - boolean
ํ•„๋“œ ์ด๋ฆ„ - isMale

ํ•„๋“œ ์œ ํ˜• - class java.lang.String
ํ•„๋“œ ์ด๋ฆ„ - address

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - MAX_AGE

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - MIN_AGE

์—„์ฒญ๋‚œ! ๋ฐฉ๋ฒ•์„ ์ข€ ๋” ์ˆ˜์ •ํ•ด ๋ด…์‹œ๋‹ค! ์—ฌ๊ธฐ์— ์•ก์„ธ์Šค ์ˆ˜์ •์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.


static void printFieldInfo(List<Field> fields){
   fields.forEach(e -> System.out.printf("Field type - %s\nField name - %s\nModifiers - %s\n\n", e.getType(), e.getName(), Modifier.toString(e.getModifiers())));
}

๊ทธ๋ฆฌ๊ณ  e.getModifiers() ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค . ์ด ๋ฉ”์„œ๋“œ๋Š” ํ•„๋“œ์˜ ์•ก์„ธ์Šค ํ•œ์ •์ž์˜ ์ƒํƒœ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” int๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Modifier ํด๋ž˜์Šค์—๋Š” ํ•„๋“œ์˜ ๊ฐ ํŠน์ • ์ˆ˜์ •์ž๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ •์  ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค .

๋ฐ˜ํ™˜ ๊ฐ’์„ Modifier.toString() ์— ๋ž˜ํ•‘ ํ•˜๊ณ  ์ฆ‰์‹œ ๊ฐ’์„ ํ…์ŠคํŠธ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

ํ•„๋“œ ์œ ํ˜• - ํด๋ž˜์Šค java.lang.String
ํ•„๋“œ ์ด๋ฆ„ - ์ด๋ฆ„
์ˆ˜์ •์ž - ๊ฐœ์ธ

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - ๋‚˜์ด
์ˆ˜์ •์ž - ๊ฐœ์ธ

ํ•„๋“œ ์œ ํ˜• - ๋ถ€์šธ
ํ•„๋“œ ์ด๋ฆ„ - isMale
์ˆ˜์ •์ž - ๊ณต๊ฐœ

ํ•„๋“œ ์œ ํ˜• - ํด๋ž˜์Šค java.lang.String
ํ•„๋“œ ์ด๋ฆ„ - ์ฃผ์†Œ
์ˆ˜์ •์ž - ๋ณดํ˜ธ๋œ

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - MAX_AGE
์ˆ˜์ •์ž - public static final

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - MIN_AGE
์ˆ˜์ •์ž - public static final

Modifier.toString() ์ด ์—†๋Š” ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค .

ํ•„๋“œ ์œ ํ˜• - ํด๋ž˜์Šค java.lang.String
ํ•„๋“œ ์ด๋ฆ„ - ์ด๋ฆ„
์ˆ˜์ •์ž - 2

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - ์—ฐ๋ น
์ˆ˜์ •์ž - 2

ํ•„๋“œ ์œ ํ˜• - ๋ถ€์šธ
ํ•„๋“œ ์ด๋ฆ„ - isMale
์ˆ˜์ •์ž - 1

ํ•„๋“œ ์œ ํ˜• - ํด๋ž˜์Šค java.lang.String
ํ•„๋“œ ์ด๋ฆ„ - ์ฃผ์†Œ
์ˆ˜์ •์ž - 4

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - MAX_AGE
์ˆ˜์ •์ž - 25

ํ•„๋“œ ์œ ํ˜• - int
ํ•„๋“œ ์ด๋ฆ„ - MIN_AGE
์ˆ˜์ •์ž - 25

getAnnotations(), getAnnotatedType() ๋ฐ getGenericType() ๋ฉ”์„œ๋“œ

์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก Person ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค . ์ž์ฒด ์ฃผ์„์„ ์ž‘์„ฑํ•˜์—ฌ ํ•„๋“œ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„๋“œ๋ฅผ ๋ช‡ ๊ฐœ ๋” ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ์ฃผ์„์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Pig Latin์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ํ•˜๋‚˜์— ์ „๋‹ฌํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ์š”์†Œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


@Target(value=ElementType.FIELD)
@Retention(value= RetentionPolicy.RUNTIME)
public @interface Name {
    String name();
}

@Target({ ElementType.TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Number {
}

๊ทธ๋ฆฌ๊ณ  ๋ฉ”์ธ ํด๋ž˜์Šค์™€ Person ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค .


public class Person {
    @Name(name = "Ame-nay")
    private String name;

    @Name(name = "User nicknames")
    List<String> nicknames;

    private final Class<Object> type;

    private int @Number[] number;

    public Person(Class<Object> type) {
        this.type = type;
    }
}

public static void main(String[] args) {
    Field[] fields = Person.class.getDeclaredFields();
    List<Field> actualFields = getFieldNames(fields);
    
    printAdditionalInfo(actualFields);
}

static void printAdditionalInfo(List<Field> fields) {
   System.out.println("\ngetAnnotatedType:");
   fields.forEach(e -> System.out.println(e.getAnnotatedType()));

   System.out.println("\ngetGenericType:");
   fields.forEach(e -> System.out.println(e.getGenericType()));

   System.out.println("\ngetAnnotations:");
   fields.forEach(e -> System.out.println(Arrays.toString(e.getAnnotations())));
}

์šฐ๋ฆฌ ๋ฐฉ๋ฒ•์˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ ์œ„ํ•œ ๊ฒƒ์ธ์ง€ ์•Œ์•„๋‚ผ ๋•Œ์ž…๋‹ˆ๋‹ค.

getAnnotatedType:
java.lang.Class<java.lang.Object>
java.util.List<java.lang.String>
java.lang.String
int @Number()[]

getGenericType:
java.lang.Class<java.lang. ๊ฐ์ฒด>
java.util.List<java.lang.String>
class java.lang.String
class [I

getAnnotations:
[]
[@Name(name="\u0055\u0073\u0065\u0072\u0020\u006e\u0069\u0063 \u006b\u006e\u0061\u006d\u0065\u0073")]
[@์ด๋ฆ„(์ด๋ฆ„="\u0041\u006d\u0065\u002d\u006e\u0061\u0079")] [
]
  • getAnnotatedType์€ ์ฃผ์–ด์ง„ ํ•„๋“œ์— ๋Œ€ํ•œ ์ฃผ์„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์žˆ๋Š” ๊ฒฝ์šฐ). ํ•„๋“œ์— ๋Œ€ํ•œ ์ฃผ์„์„ ์–ป์—ˆ๊ณ  ์™„๋ฒฝํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • getGenericType์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • getAnnotations๋Š” ๊ฐœ์ฒด์— ์ ์šฉ๋œ ์ฃผ์„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํด๋ž˜์Šค์˜ ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์™€ ์•ก์„ธ์Šค ์ˆ˜์ •์ž, ์ฃผ์„ ๋ฐ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

java.lang.reflect.Method ํด๋ž˜์Šค

๊ฐ๋…์ž! ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ˆ˜์—…์˜ ๋ถ„์•ผ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

Method ๊ฐ์ฒด๋ฅผ ์–ป์œผ๋ ค๋ฉด getMethod ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Method ๊ฐ์ฒด๋ฅผ ์–ป๋Š” ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค .


Method getNameMethod =  Person.class.getMethod("getName");

์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ์šฐ๋ฆฌ ํ•™๊ธ‰๊ณผ ํ•จ๊ป˜ ์ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. getter ๋ฐ setter, hashCode, equals ๋ฐ toString ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .


public class Person {
    private String name;
    private int age;

    public boolean isMale;

    protected String address;

    public static final int MAX_AGE = 120;
    public static final int MIN_AGE = 0;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isMale() {
        return isMale;
    }

    public void setMale(boolean male) {
        isMale = male;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", isMale=" + isMale +
                ", address='" + address + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && isMale == person.isMale && Objects.equals(name, person.name) && Objects.equals(address, person.address);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, isMale, address);
    }
}

์ด์ œ Method ํด๋ž˜์Šค ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์‚ฌํ•  ์ผ๋ จ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ค€๋น„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค . ๋‹ค์Œ์€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ• ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• ์„ค๋ช…
getName() ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getModifiers() ์ด ๋ฉ”์„œ๋“œ์˜ ์•ก์„ธ์Šค ํ•œ์ •์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getReturnType() ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getGenericReturnType() ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getParameterTypes() ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getGenericParameterTypes() ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getExceptionTypes() ๋ฉ”์„œ๋“œ๊ฐ€ throwํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getGenericExceptionTypes() ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฉ”์„œ๋“œ๊ฐ€ throwํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getAnnotations() ๋ถ€๋ชจ ์ฃผ์„์„ ํฌํ•จํ•˜์—ฌ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ฃผ์„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
getDeclaredAnnotations() ๋ถ€๋ชจ ์ฃผ์„์„ ์ œ์™ธํ•œ ๋ฉ”์„œ๋“œ์˜ ์ฃผ์„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ๋ฐฐ์—ด์„ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Method[] methods = Person.class.getDeclaredMethods();

ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

getName() ๋ฐ getModifiers() ๋ฉ”์„œ๋“œ

getName์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .


static List<String> getMethodsName(Method[] methods) {
    return Arrays.asList(methods)
            .stream()
            .map(Method::getName)
            .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
}

์ด์ œ ์ˆ˜์ •์ž๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด getModifiers๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .


static List<String> getModifiers(Method[] methods) {
    return Arrays
            .stream(methods)
            .map(Method::getModifiers)
            .map(String::valueOf)
            .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
}

์ฃผ์š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค .


public static void main(String[] args) {
    Method[] methods = Person.class.getDeclaredMethods();

    System.out.println(getMethodsName(methods));
    System.out.println(getModifiers(methods));
}

์šฐ๋ฆฌ์˜ ๊ฒฐ๊ณผ:

[getName, equals, toString, hashCode, setName, getAddress, isMale, getAge, setAge, setMale, setAddress]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

๋ชจ๋“  ๋ฉ”์„œ๋“œ์—๋Š” public ํ•œ์ •์ž๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ๋ฉ”์„œ๋“œ๋Š” 1์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์ˆ˜์ •์ž ์ž์ฒด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.


public static void main(String[] args) {
    Method[] methods = Person.class.getDeclaredMethods();

    System.out.println(getMethodsName(methods));
    System.out.println(modifyModifiers(getModifiers(methods)));
}
[getName, equals, toString, hashCode, setName, getAddress, isMale, getAge, setAge, setMale, setAddress] [
๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ, ๊ณต๊ฐœ]

getReturnedType()

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


static void getReturnedType(Method[] methods) {
    Arrays.stream(methods)
            .map(Method::getReturnType)
            .forEach(System.out::println);
}
ํด๋ž˜์Šค java.lang.String
๋ถ€์šธ
ํด๋ž˜์Šค java.lang.String
int
void
ํด๋ž˜์Šค java.lang.String
๋ถ€์šธ
int
void
void
void

getGenericReturnType()

Person ํด๋ž˜์Šค์— ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์œผ๋กœ ๋ž˜ํ•‘๋œ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณต ํ•˜๊ณ  ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•ฉ์‹œ๋‹ค.


public List<String> someMethod() {
    // Very useful and important method
    return null;
}

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ์ฃผ์š” ๋ฐฉ๋ฒ•์„ ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:


static void getGenericReturnType(Method[] methods) {
    Arrays.stream(methods)
            .map(Method::getGenericReturnType)
            .forEach(System.out::println);
}

์šฐ๋ฆฌ ๋ฐฉ๋ฒ•์˜ ๊ฒฐ๊ณผ:

ํด๋ž˜์Šค java.lang.String
๋ถ€์šธ
ํด๋ž˜์Šค java.lang.String
int
void
ํด๋ž˜์Šค java.lang.String
๋ถ€์šธ
int
void
void
void
java.util.List<java.lang.String>

getParameterTypes() ๋ฐ getGenericParameterTypes() ๋ฉ”์„œ๋“œ

์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ Person ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๋” ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.


public List<String> someMethod(List<String> list, String s) {
    // Very useful and important method
    return null;
}

์ฒซ ๋ฒˆ์งธ๋Š” ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


static void getParameterTypes(Method[] methods) {
    Class<?>[] types = method.getParameterTypes();
        for (Class<?> type : types) {
            System.out.println(type);
        }
}

static void getGenericParameterTypes(Method[] methods) {
   Type[] types = method.getGenericParameterTypes();
        for (Type type : types) {
            System.out.println(type);
        }
}

์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋งŒ ์•ก์„ธ์Šคํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์ด๋ฆ„์œผ๋กœ ๋ฉ”์„œ๋“œ์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด getMethod๋ฅผ ํ˜ธ์ถœ ํ•˜๊ณ  ์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๊ณผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.


public static void main(String[] args) throws NoSuchMethodException {
    Method currentMethod = Person.class.getMethod("someMethod", List.class, String.class);

    getParameterTypes(currentMethod);
    System.out.println();
    getGenericParameterTypes(currentMethod);
}

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€, ๋ฐ˜ํ™˜๋˜๋Š” ๋‚ด์šฉ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค java.util.List
ํด๋ž˜์Šค java.lang.String

java.util.List<java.lang.String>
ํด๋ž˜์Šค java.lang.String

getExceptionTypes() ๋ฐ getGenericExceptionTypes() ๋ฉ”์„œ๋“œ

์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋˜์งˆ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ ๋ฐฐ์—ด๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์ด ์žˆ๋Š” ์˜ˆ์™ธ(์žˆ๋Š” ๊ฒฝ์šฐ)๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ ์ •์  ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ์ƒˆ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


private static class Processor {
    private void init() {}

    private void process() throws IOException {}
}

๊ทธ๋ฆฌ๊ณ  Processor ํด๋ž˜์Šค ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค .


public static void main(String... args) throws NoSuchMethodException {
    Method method = Processor.class.getDeclaredMethod("process");
    Type[] type = method.getExceptionTypes();
    System.out.println(Arrays.toString(type));
}

์ด์ œ ์˜ˆ์™ธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[ํด๋ž˜์Šค java.io.IOException]

์ด์ œ ์œ ํ˜•์„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.


private static class Processor<E extends IOException> {

    private void process() throws E {
    }
}

๊ทธ๋ฆฌ๊ณ  ์ฃผ์š” ๋ฐฉ๋ฒ• ์˜ ์ฝ”๋“œ :


public static void main(String... args) throws NoSuchMethodException {
    Method m = Processor.class.getDeclaredMethod("process");
    Type[] t = m.getGenericExceptionTypes();
    System.out.println(Arrays.toString(t));

    for (Type type : t) {
        if (type instanceof TypeVariable) {
            for (Type type1 : ((TypeVariable) type).getBounds()) {
                System.out.println(type1);
            }
        }
    }
}

์ด ๋ฉ”์„œ๋“œ ์•ˆ์—๋Š” ์œ ํ˜• ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ๋ถ€๋ชจ ์ธํ„ฐํŽ˜์ด์Šค์ธ TypeVariables ๊ฐœ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ ์•ˆ์— ์ด์ œ ๋‚ด๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ฆ‰ ์ค‘์ฒฉ ์˜ˆ์™ธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[E]
ํด๋ž˜์Šค java.io.IOException

getAnnotations() ๋ฐ getDeclaredAnnotations() ๋ฉ”์„œ๋“œ

์ด ์ƒˆ ํด๋ž˜์Šค๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž์ฒด Annotation ์ฃผ์„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค .


@Retention(RetentionPolicy.RUNTIME)
@interface Annotation {

    public String key();
    public String value();
}

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์šฐ๋ฆฌ์˜ ๋ฐฉ๋ฒ•์— ์ ์šฉํ•˜์‹ญ์‹œ์˜ค:


@Annotation(key = "key", value = "value")
private void process() throws E{

}

๋ฌผ๋ก  ๋ชจ๋“  ์ฃผ์„์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


static void getMethodAnnotations(Class<?> clazz) {
    Method[] methods = clazz.getDeclaredMethods();
    for (Method method : methods) {
        System.out.println(method.getName());
        System.out.println(Arrays.toString(method.getAnnotations()));
        System.out.println();
    }
}

์ฃผ์š” ๋ฐฉ๋ฒ• ๊ตฌํ˜„ :


public static void main(String... args) {
    Class clazz = Processor.class;
    getMethodAnnotations(clazz);
}

๊ฒฐ๊ณผ ํ™”๋ฉด ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

process
[@com.company.Main&Annotation(key="key", value="value")]

์ด๊ฒƒ์ด ๋ฉ”์„œ๋“œ์— ์ ์šฉ๋œ ์ฃผ์„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ getAnnotations ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค์˜ ์ƒ์œ„ ์ฃผ์„์—๋„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์ด ๋ฉ”์„œ๋“œ ๋ฐ ํ•„๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ด๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION