{"id":756,"date":"2018-09-18T21:28:52","date_gmt":"2018-09-18T12:28:52","guid":{"rendered":"http:\/\/www.charlezz.com\/?p=756"},"modified":"2018-09-18T22:10:41","modified_gmt":"2018-09-18T13:10:41","slug":"%ec%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c%ec%99%80-java%ec%9d%98-reflection","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=756","title":{"rendered":"\uc548\ub4dc\ub85c\uc774\ub4dc\uc640 Java\uc758 Reflection"},"content":{"rendered":"<h1>Reflection\uc774\ub780?<\/h1>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2018\/09\/AB6E7BFA-CBB8-40C1-8609-9556B9714B6E.png\" alt=\"\" width=\"528\" height=\"358\" class=\"aligncenter size-full wp-image-761\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/09\/AB6E7BFA-CBB8-40C1-8609-9556B9714B6E.png 528w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/09\/AB6E7BFA-CBB8-40C1-8609-9556B9714B6E-300x203.png 300w\" sizes=\"(max-width: 528px) 100vw, 528px\" \/><\/p>\n<p>Reflection\uc740 \uc790\ubc14 \uc5b8\uc5b4\uc758 \uae30\ub2a5\uc911 \ud558\ub098\ub85c \ud504\ub85c\uadf8\ub7a8 \ub0b4\ubd80 \uc18d\uc131\uc744 \uc870\uc791 \ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 Java\ud074\ub798\uc2a4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ubaa8\ub4e0 \uba64\ubc84\uc758 \uc774\ub984\uc744 \uac00\uc838\uc640\uc11c \ud45c\uc2dc \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\ub978 \uc5b8\uc5b4\uc5d0\uc11c\ub294 \uc774\ub7ec\ud55c \uae30\ub2a5\uc774 \ubcf4\ud1b5 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \ud30c\uc2a4\uce7c, C,C++ \ub4f1\uc758 \uc5b8\uc5b4\uc5d0\uc11c \uc815\uc758 \ub41c \ud568\uc218\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uc5bb\ub294 \ubc29\ubc95\uc740 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uac04\ub2e8\ud55c \ub9ac\ud50c\ub809\uc158 \uc608\uc81c<\/h3>\n<p>String \ud074\ub798\uc2a4\uc758 \ud480\ud328\uc2a4\ub97c \ud1b5\ud574 String \uc774 \uac00\uc9c0\uace0 \uc788\ub294 \ubaa8\ub4e0 \uba54\uc18c\ub4dc\ub97c \ucd9c\ub825\ud558\ub294 \uac04\ub2e8\ud55c \uc608\uc81c\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">try {\r\n    Class c = Class.forName(\"java.lang.String\");\r\n    Method m[] = c.getDeclaredMethods();\r\n    for (int i = 0; i &lt; m.length; i++)\r\n        System.out.println(m[i].toString());\r\n} catch (Throwable e) {\r\n    System.err.println(e);\r\n}<\/pre>\n<h3>\ub9ac\ud50c\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c 3\uac00\uc9c0 \uc2a4\ud15d<\/h3>\n<p><strong>\uccab\uc9f8<\/strong>. \ud074\ub798\uc2a4 <strong>Class<\/strong>\uac1d\uccb4\ub97c \uc5bb\ub294\ub2e4. \uc608\ub97c\ub4e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \ud074\ub798\uc2a4 \uac1d\uccb4\ub97c \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">Class c1 = Class.forName(\"java.lang.String\"); \r\nClass c2 = int.class; \r\nClass c3 = Integer.TYPE; <\/pre>\n<p><strong>\ub458\uc9f8<\/strong>. getDeclaredMethods() \uc640 \uac19\uc740 \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c \ud55c\ub2e4. \ud074\ub798\uc2a4\ub0b4\uc5d0 \uc815\uc758\ub41c \uba54\uc18c\ub4dc\ub4e4\uc744 \ubaa8\ub450 \uac00\uc838\uc62c \uc218 \uc788\ub2e4.\u00a0<\/p>\n<p><strong>\uc14b\uc9f8.<\/strong>\u00a0\ub9ac\ud50c\ub809\uc158 API\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc815\ubcf4\ub97c \uc870\uc791\ud558\uc790.\u00a0<\/p>\n<pre class=\"lang:java decode:true \">Class c = Class.forName(\"java.lang.String\");\r\nMethod m[] = c.getDeclaredMethods();\r\nSystem.out.println(m[0].toString());<\/pre>\n<p>\uc704\uc758 \uc608\uc81c\ub294 \uccab \ubc88\uc9f8 \uba54\uc18c\ub4dc\uc758 \uc774\ub984\uc744 \ucd9c\ub825\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<h3>instanceof \uc5f0\uc0b0\uc790 \ubaa8\uc758\uc2e4\ud5d8 \ud574\ubcf4\uae30<\/h3>\n<p>\ud074\ub798\uc2a4\uc815\ubcf4\ub97c \uc190\uc5d0 \uc950\uace0 \ub098\uba74 \ud074\ub798\uc2a4 \uac1d\uccb4\uc5d0 \ub300\ud574 \uba87\uac00\uc9c0 \uad81\uae08\ud55c \uac83\uc744 \ubb3c\uc5b4\ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c\ub4e4\uba74 Class.isInstance \uba54\uc18c\ub4dc\ub294 instanceof \uc5f0\uc0b0\uc790\ub97c \uc2dc\ubbac\ub808\uc774\ud305 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">Class cls = Class.forName(\"java.lang.String\");\r\nboolean b1 = cls.isInstance(3);\r\nLog.e(TAG, \"b1=\"+b1);\/\/b1=false\r\nboolean b2 = cls.isInstance(\"Test\");\r\nLog.e(TAG, \"b2=\"+b2);\/\/b2=true<\/pre>\n<h3>\ud074\ub798\uc2a4\uc758 \uba54\uc18c\ub4dc \ucc3e\uae30<\/h3>\n<p>\ub9ac\ud50c\ub809\uc158\uc758 \uac00\uc7a5 \uae30\ubcf8\uc801\uc774\uace0 \uac00\uc7a5 \uc911\uc694\ud55c \uc0ac\uc6a9\ubc95\uc911 \ud558\ub098\uac00 \ubc14\ub85c \ud074\ub798\uc2a4\uc5d0 \uc815\uc758\ub41c \uba54\uc18c\ub4dc \ucc3e\uae30 \uc785\ub2c8\ub2e4. \uba54\uc18c\ub4dc\ub97c \ucc3e\ub294\uac83 \ubfd0\ub9cc \uc544\ub2c8\ub77c \uba54\uc18c\ub4dc\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud30c\ub77c\ubbf8\ud130 \ud0c0\uc785, Exception\ud0c0\uc785 , \ubc18\ud658 \ud0c0\uc785 \ub4f1\uc744 \uc54c\uc544 \ub0bc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">try {\r\n    Class cls = Class.forName(\"java.lang.String\");\r\n    Method methods[] = cls.getDeclaredMethods();\r\n    for (int i = 0; i &lt; methods.length; i++) {\r\n        Method m = methods[i];\r\n        Log.e(TAG, \"\uba54\uc18c\ub4dc \uc774\ub984 = \" + m.getName());\r\n        Log.e(TAG, \"\uc815\uc758\ub41c \ud074\ub798\uc2a4\uc774\ub984 = \" + m.getDeclaringClass());\r\n\r\n        Class pvec[] = m.getParameterTypes();\r\n        for (int j = 0; j &lt; pvec.length; j++) {\r\n            Log.e(TAG, \"\uc778\uc790 #\" + j + \" \" + pvec[j]);\r\n        }\r\n\r\n        Class evec[] = m.getExceptionTypes();\r\n        for (int j = 0; j &lt; evec.length; j++) {\r\n            Log.e(TAG, \"\uc775\uc149\uc158 #\" + j + \" \" + evec[j]);\r\n        }\r\n\r\n        Log.e(TAG,\"return type = \" + m.getReturnType());\r\n        Log.e(TAG,\"-----\");\r\n    }\r\n}\r\ncatch (Throwable e) {\r\n    Log.e(TAG,e.toString());\r\n}<\/pre>\n<h3>\uc0dd\uc131\uc790\uc5d0 \ub300\ud55c \uc815\ubcf4 \uc5bb\uae30<\/h3>\n<p>\uba54\uc18c\ub4dc \ucc3e\ub294 \ubc29\ubc95\uacfc \ube44\uc2b7\ud569\ub2c8\ub2e4. \uc608\uc81c\ub97c \ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">try {\r\n    Class cls = Class.forName(\"java.lang.String\");\r\n    Constructor ctorlist[] = cls.getDeclaredConstructors();\r\n    for (int i = 0; i &lt; ctorlist.length; i++) {\r\n        Constructor ct = ctorlist[i];\r\n        Log.e(TAG,\"\uc0dd\uc131\uc790 \uc774\ub984 = \" + ct.getName());\r\n        Log.e(TAG,\"\uc815\uc758\ub41c \ud074\ub798\uc2a4\uc774\ub984 = \" + ct.getDeclaringClass());\r\n        Class pvec[] = ct.getParameterTypes();\r\n        for (int j = 0; j &lt; pvec.length; j++){\r\n            Log.e(TAG,\"param #\" + j + \" \" + pvec[j]);\/\/\uc0dd\uc131\uc790 \ud30c\ub77c\ubbf8\ud130\r\n        }\r\n        Class evec[] = ct.getExceptionTypes();\r\n        for (int j = 0; j &lt; evec.length; j++){\r\n            Log.e(TAG,\"exc #\" + j + \" \" + evec[j]);\/\/\uc775\uc149\uc158 \ud0c0\uc785\r\n        }\r\n        Log.e(TAG,\"-----\");\r\n    }\r\n}\r\ncatch (Throwable e) {\r\n    Log.e(TAG,e.toString());\r\n}<\/pre>\n<p>\uc0dd\uc131\uc790\ub294 \ubc18\ud658 \ud0c0\uc785\uc774 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ubc18\ud658\ud0c0\uc785\uc740 \ube90\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\ud074\ub798\uc2a4 \ud544\ub4dc \ucc3e\uae30<\/h3>\n<p>\ud074\ub798\uc2a4\uc5d0 \uc815\uc758\ub41c \ub370\uc774\ud130 \ud544\ub4dc \ub610\ud55c \ucc3e\ub294\uac8c \uac00\ub2a5\ud569\ub2c8\ub2e4. \uc608\uc81c\ub97c \ud655\uc778 \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">try {\r\n    Class cls = Class.forName(\"java.lang.String\");\r\n    Field fieldlist[] = cls.getDeclaredFields();\r\n    for (int i = 0; i &lt; fieldlist.length; i++) {\r\n        Field fld = fieldlist[i];\r\n        Log.e(TAG,\"\ud544\ub4dc\uba85 = \" + fld.getName());\r\n        Log.e(TAG,\"\uc815\uc758\ub41c\ud074\ub798\uc2a4 = \" + fld.getDeclaringClass());\r\n        Log.e(TAG,\"\ud544\ub4dc\ud0c0\uc785 = \" + fld.getType());\r\n        int mod = fld.getModifiers();\r\n        Log.e(TAG,\"\uc811\uadfc\uc81c\uc5b4\uc790 = \" + Modifier.toString(mod));\r\n        Log.e(TAG,\"-----\");\r\n    }\r\n}\r\ncatch (Throwable e) {\r\n    Log.e(TAG,e.toString());\r\n}<\/pre>\n<p>\uc774\uc804 \uc608\uc81c\uc640 \ube44\uc2b7\ud558\uc9c0\ub9cc \ud55c\uac00\uc9c0 \uc0c8\ub85c\uc6b4 \uc810\uc740 \uc811\uadfc\uc81c\uc5b4\uc790(modifier)\ub97c \uc54c\uc218 \uc788\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4.\u00a0 \ud55c\uac00\uc9c0 \uc7ac\ubc0c\ub294 \uc810\uc740 <strong>private<\/strong> \ud544\ub4dc\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uba54\uc18c\ub4dc \uc774\ub984\uc73c\ub85c \uc2e4\ud589\ud558\uae30<\/h3>\n<p>\uc9c0\uae08\uae4c\uc9c0\uc758 \uc608\uc81c\ub294 \ud074\ub798\uc2a4 \uc815\ubcf4\uc640 \uad00\ub828\ub41c\uac83\uc744 \ucc3e\uac70\ub098 \ud45c\ud604\ud588\ub2e4\uba74, \uc774\ubc88\uc5d0\ub294 \uc870\uae08 \ub2e4\ub978 \ubc29\ubc95\uc73c\ub85c \ub9ac\ud50c\ub809\uc158\uc744 \uc0ac\uc6a9\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uba74 \uba54\uc18c\ub4dc\uc774\ub984\uc73c\ub85c \ud2b9\uc815 \uba54\uc18c\ub4dc\ub97c \uc2e4\ud589\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">try {\r\n    Class cls = Class.forName(\"java.lang.String\");\r\n    String data = \"Hello World\";\/\/\ud14c\uc2a4\ud2b8\uc6a9 \ub370\uc774\ud130\r\n    Method lengthMethod = cls.getMethod(\"length\");\/\/length()\uba54\uc18c\ub4dc\ub97c \ucc3e\ub294\ub2e4.\r\n    int length = (int) lengthMethod.invoke(data);\/\/data.length() \uc218\ud589\r\n    Log.e(TAG, \"length=\" + length); \/\/length=11 \ucd9c\ub825\r\n\r\n    Method substringMethod = cls.getMethod(\"substring\", int.class, int.class);\r\n    \/\/\ub450\uac1c\uc758 int\ud0c0\uc785\uc774 \uc788\ub294 substring\uba54\uc18c\ub4dc\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.\r\n    String subStr = (String) substringMethod.invoke(data,0, 5);\r\n    \/\/data.substring(0,5)\uc640 \uac19\uc740 \ud6a8\uacfc\r\n    Log.e(TAG,\"subStr=\"+subStr);\/\/Hello \ucd9c\ub825\r\n} catch (Throwable e) {\r\n    Log.e(TAG, e.toString());\r\n}<\/pre>\n<p>\uadf8\ub7fc \ud55c\uac00\uc9c0 \uc758\ubb38\uc810\uc774 \uc0dd\uae38\uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><em>private\ud55c \uba54\uc18c\ub4dc\ub3c4 \ucc3e\ub294\ub370 invoke\ub294 \ubabb\ud558\ub098?<\/em><\/p>\n<p>\uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">public class A {\r\n    public static final String TAG = A.class.getSimpleName();\r\n\r\n    private void show() {\r\n        Log.e(TAG, \"Hello I am private method\");\r\n    }\r\n}<\/pre>\n<pre class=\"lang:java decode:true\">try {\r\n    A a = new A();\r\n    \/\/\uba54\uc18c\ub4dc\uac00 private\ud558\uc5ec a.show() \ucc3e\uc744 \uc218\uac00 \uc5c6\uc74c\r\n    Method showMethod = a.getClass().getDeclaredMethod(\"show\");\r\n    showMethod.setAccessible(true); \/\/\uc811\uadfc \uac00\ub2a5!\r\n    showMethod.invoke(a);\r\n}catch (Exception e){\r\n    Log.e(TAG,e.toString());\r\n}<\/pre>\n<p>A\ub77c\ub294 \ud074\ub798\uc2a4\uc5d0\uc11c private\ud55c \uba54\uc18c\ub4dc show()\ub97c \uc120\uc5b8\ud558\uba74 \ub2e4\ub978 \ud074\ub798\uc2a4\uc5d0\uc11c\ub294 \uc774 \ud074\ub798\uc2a4\ub85c \ub9cc\ub4e0 \uc778\uc2a4\ud134\uc2a4\ub85c\ub294 \uba54\uc18c\ub4dc\uc5d0 \uc811\uadfc\uc774 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9ac\ud50c\ub809\uc158\uc740 \uc774\ub97c \uac00\ub2a5\ud558\uac8c \ud574\uc90d\ub2c8\ub2e4.<\/p>\n<p><em><strong>Note:<\/strong>getMethod()\ub294 public\ud55c \uba54\uc18c\ub4dc\ub97c \uac00\uc9c0\uace0 \uc624\uba70, getDeclaredMethod()\ub294 private\ud55c \uba54\uc18c\ub4dc\ub97c \ud3ec\ud568\ud55c \ud074\ub798\uc2a4\uc5d0 \uc120\uc5b8\ub41c \ubaa8\ub4e0 \uba54\uc18c\ub4dc\ub97c \uac00\uc9c0\uace0 \uc628\ub2e4.<\/em><\/p>\n<h3>\ub9ac\ud50c\ub809\uc158\uc73c\ub85c \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\ud558\uae30<\/h3>\n<p>\ub9ac\ud50c\ub809\uc158\uc73c\ub85c \uc624\ube0c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\uc81c\ub97c \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">public class Person {\r\n\r\n    public static final String TAG = Person.class.getSimpleName();\r\n\r\n    String name;\r\n    int age;\r\n\r\n    public Person(String name, int age){\r\n        this.name = name;\r\n        this.age = age;\r\n    }\r\n\r\n    public void sayMyName(){\r\n        Log.e(TAG,String.format(\"Hello! My name is %s and I'm %d years old\",name, age) );\r\n    }\r\n}\r\n<\/pre>\n<pre class=\"lang:java decode:true\">try {\r\n    Class personClass = Class.forName(\"com.charlezz.reflection.Person\");\r\n    Constructor personConstructor = personClass.getConstructor(String.class, int.class);\r\n    Person person = (Person) personConstructor.newInstance(\"Charles\",20);\r\n    person.sayMyName();\r\n\r\n    \/\/Hello! My name is Charles and I'm 20 years old \ucd9c\ub825\r\n}\r\ncatch (Throwable e) {\r\n    Log.e(TAG,e.toString());\r\n}<\/pre>\n<p>Constructor.newInstance\ub97c \uc774\uc6a9\ud558\uc5ec new \uc0dd\uc131\uc790()\uc640 \uac19\uc774 \uac1d\uccb4\ub97c \uc0dd\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\ud544\ub4dc\uc758 \uac12 \ubcc0\uacbd\ud558\uae30<\/h3>\n<p>\ud544\ub4dc\uc758 \uac12 \ub610\ud55c \ub9ac\ud50c\ub809\uc158\uc744 \uc774\uc6a9\ud55c\ub2e4\uba74 \ubcc0\uacbd\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\uc704\uc758 \uc791\uc131\ud55c Person \ud074\ub798\uc2a4\ub97c \uac00\uc9c0\uace0 \ub2e4\uc2dc \ud55c \ubc88 \uc608\uc81c\ub97c \ud655\uc778\ud574\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">try {\r\n    Class cls = Class.forName(\"com.charlezz.reflection.Person\");\r\n    Field ageField = cls.getField(\"age\");\r\n    Person person = new Person(\"Charles\", 20);\r\n    Log.e(TAG,\"person.age = \" + person.age);\/\/person.age = 20\r\n    ageField.setInt(person, 10);\r\n    Log.e(TAG,\"person.age = \" + person.age);\/\/person.age = 10\r\n}\r\ncatch (Throwable e) {\r\n    Log.e(TAG,e.toString());\r\n}<\/pre>\n<p>setXXX()\uba54\uc18c\ub4dc\ub97c \uc774\uc6a9\ud558\uba74 \ud544\ub4dc\uc758 \uac12\uc744 \ubcc0\uacbd \uc2dc\ud0ac \uc218 \uc788\ub2e4\ub294 \uc810\uc744 \ud655\uc778\ud558\uc600\uc2b5\ub2c8\ub2e4.<br \/>\n<del>\uc2e4\uc81c \uc81c \ub098\uc774\ub3c4 10\uc0b4 \uc5b4\ub824\uc84c\uc73c\uba74 \uc88b\uaca0\ub124\uc694.<\/del><\/p>\n<h1>Conclusion<\/h1>\n<p>\uc624\ub79c\ub9cc\uc5d0 \uc790\ubc14\ucf54\ub4dc\ub85c \uc608\uc81c\ub97c \uc791\uc131\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc2e4\uc81c\ub85c \ub9ac\ud50c\ub809\uc158\uc740 \ube44\uc6a9\uc774 \ud070 \uc791\uc5c5\uc774\ubbc0\ub85c \uc2e0\uc911\ud558\uac8c \uc0ac\uc6a9\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4. \ub300\ubd80\ubd84\uc758 \uc548\ub4dc\ub85c\uc774\ub4dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uac1c\ubc1c\uc5d0 \uc788\uc5b4\uc11c \ub9ac\ud50c\ub809\uc158\uc744 \uc9c1\uc811\uc801\uc73c\ub85c \uc4f8\uc77c\uc740 \ub9ce\uc9c0 \uc54a\uc9c0\ub9cc \uc548\ub4dc\ub85c\uc774\ub4dc(\uc790\ubc14) \uac1c\ubc1c\uc790\ub77c\uba74 \ubc18\ub4dc\uc2dc \uc54c\uace0 \uc788\uc5b4\uc57c \ud558\ub294 \uac1c\ub150\uc774\ubbc0\ub85c \uc774\ubc88 \ud3ec\uc2a4\ud305\uc744 \uc791\uc131\ud558\uc600\uc2b5\ub2c8\ub2e4.\u00a0<\/p>\n<p>Ps: \uc81c \uacbd\uc6b0\uc5d0\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc <a href=\"https:\/\/android.googlesource.com\/platform\/frameworks\/base\/+\/master\/core\/java\/android\/bluetooth\/BluetoothAdapter.java\">BluetoothAdapter<\/a>\uc758 \uc228\uaca8\uc9c4 \uba54\uc18c\ub4dc\uc778 setScanMode(int mode)\ub97c \uc0ac\uc6a9\ud558\uc5ec discoverable \uc0c1\ud0dc\ub97c \uc9c0\uc18d\uc2dc\ud0a8\ub2e4\uac70\ub098, \ucee4\uc2a4\ud140 \ub86c\uc774 \ud3ec\ud305\ub41c \uae30\uae30\uc758 API\uc0ac\uc6a9\uc744 \uc704\ud574\uc11c \ub9ac\ud50c\ub809\uc158\uc744 \uc0ac\uc6a9\ud55c \uacbd\ud5d8 \ub4f1\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>\ubcf8\ubb38\uc758 \uc608\uc81c\ub294 <a href=\"https:\/\/github.com\/Charlezz\/ReflectionTest\">github<\/a>\uc5d0\uc11c \ud655\uc778 \uac00\ub2a5\ud569\ub2c8\ub2e4. \uac10\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reflection\uc774\ub780? Reflection\uc740 \uc790\ubc14 \uc5b8\uc5b4\uc758 \uae30\ub2a5\uc911 \ud558\ub098\ub85c \ud504\ub85c\uadf8\ub7a8 \ub0b4\ubd80 \uc18d\uc131\uc744 \uc870\uc791 \ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 Java\ud074\ub798\uc2a4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ubaa8\ub4e0 \uba64\ubc84\uc758 \uc774\ub984\uc744 \uac00\uc838\uc640\uc11c \ud45c\uc2dc \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\ub978 \uc5b8\uc5b4\uc5d0\uc11c\ub294 \uc774\ub7ec\ud55c \uae30\ub2a5\uc774 \ubcf4\ud1b5 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \ud30c\uc2a4\uce7c, C,C++ \ub4f1\uc758 \uc5b8\uc5b4\uc5d0\uc11c \uc815\uc758 \ub41c \ud568\uc218\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uc5bb\ub294 \ubc29\ubc95\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \uac04\ub2e8\ud55c \ub9ac\ud50c\ub809\uc158 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[25],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/756"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=756"}],"version-history":[{"count":3,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/756\/revisions"}],"predecessor-version":[{"id":762,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/756\/revisions\/762"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}