{"id":25531279,"date":"2022-07-02T23:11:52","date_gmt":"2022-07-02T17:41:52","guid":{"rendered":"https:\/\/entri.app\/blog\/?p=25531279"},"modified":"2022-11-23T15:20:13","modified_gmt":"2022-11-23T09:50:13","slug":"how-to-use-reflection-in-java-a-guide","status":"publish","type":"post","link":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/","title":{"rendered":"How to Use Reflection in Java? A Guide"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69e76da613619\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69e76da613619\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#1_Overview\" >1. Overview<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#2_Project_Setup\" >2. Project Setup<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#3_Simple_Example\" >3. Simple Example<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#4_Java_Reflection_Use_Cases\" >4. Java Reflection Use Cases<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#5_Inspecting_Java_Classes\" >5. Inspecting Java Classes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#6_Inspecting_Constructors\" >6. Inspecting Constructors<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#7_Inspecting_Fields\" >7. Inspecting Fields<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#8_Inspecting_Methods\" >8. Inspecting Methods<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#Reflection_API_in_JAVA\" >Reflection API in JAVA<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#9_Conclusion\" >9. Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<div class=\"wWOJcd\" role=\"button\" aria-labelledby=\"exacc_tp29YpvkNeGC4-EPpMK52Ak7\"><\/div>\n<div id=\"exacc_tp29YpvkNeGC4-EPpMK52Ak8\" class=\"MBtdbb\" data-ved=\"2ahUKEwibl5_-nNX4AhVhwTgGHSRhDpsQ7NUEegQIGxAD\">\n<div class=\"ymu2Hb\">\n<div id=\"_tp29YpvkNeGC4-EPpMK52Ak33\" class=\"t0bRye r2fjmd\" data-hveid=\"CBsQBA\" data-ved=\"2ahUKEwibl5_-nNX4AhVhwTgGHSRhDpsQu04oAHoECBsQBA\">\n<div id=\"tp29YpvkNeGC4-EPpMK52Ak__5\">\n<div class=\"wDYxhc NFQFxe oHglmf xzPb7d\" data-md=\"32\" data-hveid=\"CBwQAA\" data-ved=\"2ahUKEwibl5_-nNX4AhVhwTgGHSRhDpsQ4dMGegQIHBAA\">\n<div id=\"media_result_group\" class=\"kno-mrg-si kno-mrg kno-swp\" data-hveid=\"CBwQAQ\">\n<div class=\"kno-fiu kno-liu\">\n<div data-count=\"1\" data-hveid=\"CBgQAA\">\n<div class=\"umyQi\" data-h=\"130\" data-nr=\"1\">\n<div class=\"eA0Zlc ivg-i PZPZlf img-kc-m GMCzAd\" aria-hidden=\"true\" data-attrid=\"image\" data-docid=\"wZTe0JfT1qBfNM\" data-lpage=\"https:\/\/www.geeksforgeeks.org\/reflection-in-java\/\" data-ni=\"1\" data-ved=\"2ahUKEwibl5_-nNX4AhVhwTgGHSRhDpsQzkx6BAgaEAA\">\n<div class=\"uhHOwf BYbUcd\" data-bla=\"\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"tp29YpvkNeGC4-EPpMK52Ak__11\">\n<div class=\"wDYxhc\" data-md=\"61\">\n<div role=\"heading\" data-attrid=\"wa:\/description\" data-hveid=\"CBEQAA\"><\/div>\n<div class=\"LGOjhe\" role=\"heading\" data-attrid=\"wa:\/description\" data-hveid=\"CBEQAA\"><span class=\"ILfuVd\" lang=\"en\"><span class=\"hgKElc\">Reflection API in JAVA is an API that is used to examine or modify the behavior of methods, classes, and interfaces at runtime. The required classes for reflection are provided under java.lang.reflect package which is essential in order to understand reflection.<\/span><\/span><\/div>\n<div role=\"heading\" data-attrid=\"wa:\/description\" data-hveid=\"CBEQAA\"><a href=\"https:\/\/bit.ly\/3ELmCiA\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-25520910 size-full\" src=\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square.png\" alt=\"Python and Machine Learning Square\" width=\"345\" height=\"345\" srcset=\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square.png 345w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-300x300.png 300w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-150x150.png 150w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-24x24.png 24w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-48x48.png 48w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-96x96.png 96w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-75x75.png 75w\" sizes=\"auto, (max-width: 345px) 100vw, 345px\" \/><\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2 data-id=\"Overview\"><span class=\"ez-toc-section\" id=\"1_Overview\"><\/span><strong>1. Overview<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Overview\" class=\"bd-anchor\"><\/div>\n<p>In this tutorial, we will explore Java reflection, which allows us to inspect and\/or modify runtime attributes of classes, interfaces, fields and methods. This particularly comes in handy when we don&#8217;t know their names at compile time.<\/p>\n<p>Additionally, we can instantiate new objects, invoke methods and get or set field values using reflection.<\/p>\n<p style=\"text-align: center;\"><strong><a href=\"https:\/\/bit.ly\/3ELmCiA\" target=\"_blank\" rel=\"noopener\">Learn Coding in your Language! Enroll Here!<\/a><\/strong><\/p>\n<h2 data-id=\"Setup\"><span class=\"ez-toc-section\" id=\"2_Project_Setup\"><\/span><strong>2. Project Setup<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Setup\" class=\"bd-anchor\"><\/div>\n<p><strong>To use Java reflection, we don&#8217;t need to include any special jars<\/strong>, any special configuration or Maven dependencies. The JDK ships with a group of classes that are bundled in the\u00a0<em>java.lang.reflect<\/em>\u00a0package specifically for this purpose.<\/p>\n<p>So, all we need to do is to make the following import into our code:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">import<\/span> java.lang.reflect.*;<\/code><\/pre>\n<p>And we are good to go.<\/p>\n<div class=\"code-block code-block-2\">\n<div id=\"baeldung_leaderboard_mid_1\" align=\"center\" data-freestar-ad=\"__336x280 __728x90\"><\/div>\n<\/div>\n<p>To get access to the class, method and field information of an instance, we call the\u00a0<em>getClass<\/em>\u00a0method, which returns the runtime class representation of the object. The returned\u00a0<em>class<\/em>\u00a0object provides methods for accessing information about a class.<\/p>\n<h2 data-id=\"Example\"><span class=\"ez-toc-section\" id=\"3_Simple_Example\"><\/span><strong>3. Simple Example<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Example\" class=\"bd-anchor\"><\/div>\n<p>To get our feet wet, we&#8217;ll look at a very basic example that inspects the fields of a simple Java object at runtime.<\/p>\n<p>Let&#8217;s create a simple\u00a0<em>Person<\/em>\u00a0class with only\u00a0<em>name<\/em>\u00a0and\u00a0<em>age<\/em>\u00a0fields and no methods at all.<\/p>\n<p>Here is the Person class:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">Person<\/span> {\r\n    <span class=\"hljs-keyword\">private<\/span> String name;\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-type\">int<\/span> age;\r\n}<\/code><\/pre>\n<p>We&#8217;ll now use Java reflection to discover the names of all fields of this class.<\/p>\n<div class=\"code-block code-block-3\">\n<div id=\"baeldung_leaderboard_mid_2\" align=\"center\" data-freestar-ad=\"__300x250 __336x280\"><\/div>\n<\/div>\n<p>To appreciate the power of reflection, let&#8217;s construct a\u00a0<em>Person<\/em>\u00a0object and use Object as the reference type:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenObject_whenGetsFieldNamesAtRuntime_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    <span class=\"hljs-type\">Object<\/span> <span class=\"hljs-variable\">person<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Person<\/span>();\r\n    Field[] fields = person.getClass().getDeclaredFields();\r\n\r\n    List&lt;String&gt; actualFieldNames = getFieldNames(fields);\r\n\r\n    assertTrue(Arrays.asList(<span class=\"hljs-string\">\"name\"<\/span>, <span class=\"hljs-string\">\"age\"<\/span>)\r\n      .containsAll(actualFieldNames));\r\n}<\/code><\/pre>\n<p>This test shows us that we are able to get an array of\u00a0<em>F<\/em><em>ield<\/em>\u00a0objects from our\u00a0<em>person<\/em>\u00a0object, even if the reference to the object is a parent type of that object.<\/p>\n<p>In the above example, we were only interested in the names of those fields. But there is much more that can be done, and we will see examples of this in the next sections.<\/p>\n<p>Notice how we use a helper method to extract the actual field names.<\/p>\n<p>It&#8217;s a very basic code:<\/p>\n<div class=\"code-block code-block-4\">\n<div id=\"baeldung_leaderboard_mid_3\" align=\"center\" data-freestar-ad=\"__300x250 __336x280\"><\/div>\n<\/div>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> List&lt;String&gt; <span class=\"hljs-title function_\">getFieldNames<\/span><span class=\"hljs-params\">(Field[] fields)<\/span> {\r\n    List&lt;String&gt; fieldNames = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ArrayList<\/span>&lt;&gt;();\r\n    <span class=\"hljs-keyword\">for<\/span> (Field field : fields)\r\n      fieldNames.add(field.getName());\r\n    <span class=\"hljs-keyword\">return<\/span> fieldNames;\r\n}<\/code><\/pre>\n<h2 data-id=\"Reflection\"><span class=\"ez-toc-section\" id=\"4_Java_Reflection_Use_Cases\"><\/span><strong>4. Java Reflection Use Cases<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Reflection\" class=\"bd-anchor\"><\/div>\n<p>Before we proceed to the different features of Java reflection, we&#8217;ll discuss some of the common uses we may find for it. Java reflection is extremely powerful and can come in very handy in a number of ways.<\/p>\n<p>For instance, in many cases, we have a naming convention for database tables. We may choose to add consistency by prefixing our table names with\u00a0<em>tbl_<\/em>\u00a0so that a table with student data is called\u00a0<em>tbl_student_data<\/em>.<\/p>\n<p>In such cases, we could name the Java object holding student data as\u00a0<em>Student<\/em>\u00a0or\u00a0<em>StudentData<\/em>. Then using the CRUD paradigm, we have one entry point for each operation so that\u00a0<em>Create<\/em>\u00a0operations only receive an\u00a0<em>Object<\/em>\u00a0parameter.<\/p>\n<p>We then use reflection to retrieve the object name and field names. At this point, we can map this data to a DB table and assign the object field values to the appropriate DB field names.<\/p>\n<h2 data-id=\"Inspecting\"><span class=\"ez-toc-section\" id=\"5_Inspecting_Java_Classes\"><\/span><strong>5. Inspecting Java Classes<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Inspecting\" class=\"bd-anchor\"><\/div>\n<p>In this section, we will explore the most fundamental component in the Java Reflection API. Java class objects, as we mentioned earlier, give us access to the internal details of any object.<\/p>\n<p>We are going to examine internal details such as an object&#8217;s class name, modifiers, fields, methods, implemented interfaces, etc.<\/p>\n<h3 data-id=\"1-getting-ready\"><strong>5.1. Getting Ready<\/strong><\/h3>\n<div id=\"1-getting-ready\" class=\"bd-anchor\"><\/div>\n<p>To get a firm grip on the reflection API as applied to Java classes and have examples with variety, let&#8217;s create an abstract\u00a0<em>Animal<\/em>\u00a0class that implements the\u00a0<em>Eating<\/em>\u00a0interface. This interface defines the eating behavior of any concrete\u00a0<em>Animal<\/em>\u00a0object we create.<\/p>\n<p>First, here is the\u00a0<em>Eating<\/em>\u00a0interface:<\/p>\n<div class=\"code-block code-block-5\">\n<div id=\"baeldung_incontent_1\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title class_\">Eating<\/span> {\r\n    String <span class=\"hljs-title function_\">eats<\/span><span class=\"hljs-params\">()<\/span>;\r\n}<\/code><\/pre>\n<p>And here is the concrete\u00a0<em>Animal<\/em>\u00a0implementation of the\u00a0<em>Eating<\/em>\u00a0interface:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">Animal<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title class_\">Eating<\/span> {\r\n\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">CATEGORY<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-string\">\"domestic\"<\/span>;\r\n    <span class=\"hljs-keyword\">private<\/span> String name;\r\n\r\n    <span class=\"hljs-keyword\">protected<\/span> <span class=\"hljs-keyword\">abstract<\/span> String <span class=\"hljs-title function_\">getSound<\/span><span class=\"hljs-params\">()<\/span>;\r\n\r\n    <span class=\"hljs-comment\">\/\/ constructor, standard getters and setters omitted <\/span>\r\n}<\/code><\/pre>\n<p>Let&#8217;s also create another interface called\u00a0<em>Locomotion<\/em>\u00a0that describes how an animal moves:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title class_\">Locomotion<\/span> {\r\n    String <span class=\"hljs-title function_\">getLocomotion<\/span><span class=\"hljs-params\">()<\/span>;\r\n}<\/code><\/pre>\n<p>We&#8217;ll now create a concrete class called\u00a0<em>Goat<\/em>\u00a0that extends\u00a0<em>Animal<\/em>\u00a0and implements\u00a0<em>Locomotion<\/em>.<\/p>\n<p>Since the superclass implements\u00a0<em>Eating<\/em>,\u00a0<em>Goat<\/em>\u00a0will have to implement that interface&#8217;s methods as well:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">Goat<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title class_\">Animal<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title class_\">Locomotion<\/span> {\r\n\r\n    <span class=\"hljs-meta\">@Override<\/span>\r\n    <span class=\"hljs-keyword\">protected<\/span> String <span class=\"hljs-title function_\">getSound<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"bleat\"<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Override<\/span>\r\n    <span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title function_\">getLocomotion<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"walks\"<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Override<\/span>\r\n    <span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title function_\">eats<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"grass\"<\/span>;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ constructor omitted<\/span>\r\n}<\/code><\/pre>\n<p>From this point onward, we will use Java reflection to inspect aspects of Java objects that appear in the classes and interfaces above.<\/p>\n<h3 data-id=\"2-class-names\"><strong>5.2. Class Names<\/strong><\/h3>\n<div id=\"2-class-names\" class=\"bd-anchor\"><\/div>\n<p>Let&#8217;s start by getting the name of an object from the\u00a0<em>Class<\/em>:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenObject_whenGetsClassName_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    <span class=\"hljs-type\">Object<\/span> <span class=\"hljs-variable\">goat<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Goat<\/span>(<span class=\"hljs-string\">\"goat\"<\/span>);\r\n    Class&lt;?&gt; clazz = goat.getClass();\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"Goat\"<\/span>, clazz.getSimpleName());\r\n    assertEquals(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>, clazz.getName());\r\n    assertEquals(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>, clazz.getCanonicalName());\r\n}<\/code><\/pre>\n<p>Note that the\u00a0<em>getSimpleName<\/em>\u00a0method of\u00a0<em>Class<\/em>\u00a0returns the basic name of the object as it would appear in its declaration. Then the other two methods return the fully qualified class name including the package declaration.<\/p>\n<p>Let&#8217;s also see how we can create an object of the\u00a0<em>Goat<\/em>\u00a0class if we only know its fully qualified class name:<\/p>\n<div class=\"code-block code-block-6\">\n<div id=\"baeldung_incontent_2\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClassName_whenCreatesObject_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; clazz = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>);\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"Goat\"<\/span>, clazz.getSimpleName());\r\n    assertEquals(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>, clazz.getName());\r\n    assertEquals(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>, clazz.getCanonicalName()); \r\n}<\/code><\/pre>\n<p>Notice that the name we pass to the static\u00a0<em>forName<\/em>\u00a0method should include the package information. Otherwise, we will get a\u00a0<em>ClassNotFoundException<\/em>.<\/p>\n<h3 data-id=\"3-class-modifiers\"><strong>5.3. Class Modifiers<\/strong><\/h3>\n<div id=\"3-class-modifiers\" class=\"bd-anchor\"><\/div>\n<p>We can determine the modifiers used in a class by calling the\u00a0<em>getModifiers<\/em>\u00a0method, which returns an\u00a0<em>Integer<\/em>. Each modifier is a flag bit that is either set or cleared.<\/p>\n<p>The\u00a0<em>java.lang.reflect.Modifier<\/em>\u00a0class offers static methods that analyze the returned\u00a0<em>Integer<\/em>\u00a0for the presence or absence of a specific modifier.<\/p>\n<p>Let&#8217;s confirm the modifiers of some of the classes we defined above:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenRecognisesModifiers_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    Class&lt;?&gt; goatClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>);\r\n    Class&lt;?&gt; animalClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Animal\"<\/span>);\r\n\r\n    <span class=\"hljs-type\">int<\/span> <span class=\"hljs-variable\">goatMods<\/span> <span class=\"hljs-operator\">=<\/span> goatClass.getModifiers();\r\n    <span class=\"hljs-type\">int<\/span> <span class=\"hljs-variable\">animalMods<\/span> <span class=\"hljs-operator\">=<\/span> animalClass.getModifiers();\r\n\r\n    assertTrue(Modifier.isPublic(goatMods));\r\n    assertTrue(Modifier.isAbstract(animalMods));\r\n    assertTrue(Modifier.isPublic(animalMods));\r\n}<\/code><\/pre>\n<p>We are able to inspect modifiers of any class located in a library jar that we are importing into our project.<\/p>\n<p>In most cases, we may need to use the\u00a0<em>forName<\/em> approach rather than the full-blown instantiation since that would be an expensive process in the case of memory-heavy classes.<\/p>\n<h3 data-id=\"4-package-information\"><strong>5.4. Package Information<\/strong><\/h3>\n<div id=\"4-package-information\" class=\"bd-anchor\"><\/div>\n<p>By using Java reflection, we are also able to get information about the package of any class or object. This data is bundled inside the\u00a0<em>Package<\/em>\u00a0class, which is returned by a call to\u00a0<em>getPackage<\/em>\u00a0method on the class object.<\/p>\n<p>Let&#8217;s run a test to retrieve the package name:<\/p>\n<div class=\"code-block code-block-7\">\n<div id=\"baeldung_incontent_3\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsPackageInfo_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    <span class=\"hljs-type\">Goat<\/span> <span class=\"hljs-variable\">goat<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Goat<\/span>(<span class=\"hljs-string\">\"goat\"<\/span>);\r\n    Class&lt;?&gt; goatClass = goat.getClass();\r\n    <span class=\"hljs-type\">Package<\/span> <span class=\"hljs-variable\">pkg<\/span> <span class=\"hljs-operator\">=<\/span> goatClass.getPackage();\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"com.baeldung.reflection\"<\/span>, pkg.getName());\r\n}<\/code><\/pre>\n<p style=\"text-align: center;\"><strong><a href=\"https:\/\/bit.ly\/3ELmCiA\" target=\"_blank\" rel=\"noopener\">Grab the opportunity to learn Python with Entri! Click Here<\/a><\/strong><\/p>\n<h3 data-id=\"5-superclass\"><strong>5.5. Superclass<\/strong><\/h3>\n<div id=\"5-superclass\" class=\"bd-anchor\"><\/div>\n<p>We are also able to obtain the superclass of any Java class by using Java reflection.<\/p>\n<p>In many cases, especially while using library classes or Java&#8217;s built-in classes, we may not know beforehand the superclass of an object we are using. This subsection will show how to obtain this information.<\/p>\n<p>Let&#8217;s go ahead and determine the superclass of\u00a0<em>Goat<\/em>.<\/p>\n<p>Additionally, we also show that\u00a0<em>java.lang.String<\/em>\u00a0class is a subclass of\u00a0<em>java.lang.Object<\/em>\u00a0class:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsSuperClass_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    <span class=\"hljs-type\">Goat<\/span> <span class=\"hljs-variable\">goat<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Goat<\/span>(<span class=\"hljs-string\">\"goat\"<\/span>);\r\n    <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">str<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-string\">\"any string\"<\/span>;\r\n\r\n    Class&lt;?&gt; goatClass = goat.getClass();\r\n    Class&lt;?&gt; goatSuperClass = goatClass.getSuperclass();\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"Animal\"<\/span>, goatSuperClass.getSimpleName());\r\n    assertEquals(<span class=\"hljs-string\">\"Object\"<\/span>, str.getClass().getSuperclass().getSimpleName());\r\n}<\/code><\/pre>\n<h3 data-id=\"6-implemented-interfaces\"><strong>5.6. Implemented Interfaces<\/strong><\/h3>\n<div id=\"6-implemented-interfaces\" class=\"bd-anchor\"><\/div>\n<p>Using Java reflection, we are also able to<strong>\u00a0get the list of interfaces implemented by a given class.<\/strong><\/p>\n<p>Let&#8217;s retrieve the class types of the interfaces implemented by the\u00a0<em>Goat<\/em>\u00a0class and the\u00a0<em>Animal<\/em>\u00a0abstract class:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsImplementedInterfaces_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; goatClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>);\r\n    Class&lt;?&gt; animalClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Animal\"<\/span>);\r\n\r\n    Class&lt;?&gt;[] goatInterfaces = goatClass.getInterfaces();\r\n    Class&lt;?&gt;[] animalInterfaces = animalClass.getInterfaces();\r\n\r\n    assertEquals(<span class=\"hljs-number\">1<\/span>, goatInterfaces.length);\r\n    assertEquals(<span class=\"hljs-number\">1<\/span>, animalInterfaces.length);\r\n    assertEquals(<span class=\"hljs-string\">\"Locomotion\"<\/span>, goatInterfaces[<span class=\"hljs-number\">0<\/span>].getSimpleName());\r\n    assertEquals(<span class=\"hljs-string\">\"Eating\"<\/span>, animalInterfaces[<span class=\"hljs-number\">0<\/span>].getSimpleName());\r\n}<\/code><\/pre>\n<p>Notice from the assertions that each class implements only a single interface. Inspecting the names of these interfaces, we find that\u00a0<em>Goat<\/em>\u00a0implements\u00a0<em>Locomotion<\/em>\u00a0and\u00a0<em>Animal<\/em>\u00a0implements\u00a0<em>Eating<\/em>, just as it appears in our code.<\/p>\n<p>We can see that\u00a0<em>Goat<\/em>\u00a0is a subclass of the abstract class\u00a0<em>Animal<\/em>\u00a0and implements the interface method\u00a0<em>eats()<\/em>. Then,\u00a0<em>Goat<\/em>\u00a0also implements the\u00a0<em>Eating<\/em>\u00a0interface.<\/p>\n<div class=\"code-block code-block-8\">\n<div id=\"baeldung_incontent_4\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<p>It is therefore worth noting that only those interfaces that a class explicitly declares as implemented with the\u00a0<em>implements<\/em>\u00a0keyword appear in the returned array.<\/p>\n<p>So, even if a class implements interface methods because its superclass implements that interface, but the subclass does not directly declare that interface with the\u00a0<em>implements<\/em>\u00a0keyword, that interface will not appear in the array of interfaces.<\/p>\n<h3 data-id=\"7-constructors-methods-and-fields\"><strong>5.7. Constructors, Methods and Fields<\/strong><\/h3>\n<div id=\"7-constructors-methods-and-fields\" class=\"bd-anchor\"><\/div>\n<p>With Java reflection, we are able to inspect the constructors of any object&#8217;s class as well as methods and fields.<\/p>\n<p>Later, we&#8217;ll be able to see deeper inspections on each of these components of a class. But for now, it&#8217;s enough to just get their names and compare them with what we expect.<\/p>\n<p>Let&#8217;s see how to get the constructor of the\u00a0<em>Goat<\/em>\u00a0class:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsConstructor_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; goatClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>);\r\n\r\n    Constructor&lt;?&gt;[] constructors = goatClass.getConstructors();\r\n\r\n    assertEquals(<span class=\"hljs-number\">1<\/span>, constructors.length);\r\n    assertEquals(<span class=\"hljs-string\">\"com.baeldung.reflection.Goat\"<\/span>, constructors[<span class=\"hljs-number\">0<\/span>].getName());\r\n}<\/code><\/pre>\n<p>We can also inspect the fields of the\u00a0<em>Animal<\/em>\u00a0class:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsFields_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; animalClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Animal\"<\/span>);\r\n    Field[] fields = animalClass.getDeclaredFields();\r\n\r\n    List&lt;String&gt; actualFields = getFieldNames(fields);\r\n\r\n    assertEquals(<span class=\"hljs-number\">2<\/span>, actualFields.size());\r\n    assertTrue(actualFields.containsAll(Arrays.asList(<span class=\"hljs-string\">\"name\"<\/span>, <span class=\"hljs-string\">\"CATEGORY\"<\/span>)));\r\n}<\/code><\/pre>\n<p>And we can similarly inspect the methods of the\u00a0<em>Animal<\/em>\u00a0class:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsMethods_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; animalClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Animal\"<\/span>);\r\n    Method[] methods = animalClass.getDeclaredMethods();\r\n    List&lt;String&gt; actualMethods = getMethodNames(methods);\r\n\r\n    assertEquals(<span class=\"hljs-number\">4<\/span>, actualMethods.size());\r\n    assertTrue(actualMethods.containsAll(Arrays.asList(<span class=\"hljs-string\">\"getName\"<\/span>,\r\n      <span class=\"hljs-string\">\"setName\"<\/span>, <span class=\"hljs-string\">\"getSound\"<\/span>)));\r\n}<\/code><\/pre>\n<p>Just like\u00a0<em>getFieldNames<\/em>, we have added a helper method to retrieve method names from an array of\u00a0<em>Method<\/em>\u00a0objects:<\/p>\n<div class=\"code-block code-block-9\">\n<div id=\"baeldung_incontent_5\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> List&lt;String&gt; <span class=\"hljs-title function_\">getMethodNames<\/span><span class=\"hljs-params\">(Method[] methods)<\/span> {\r\n    List&lt;String&gt; methodNames = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ArrayList<\/span>&lt;&gt;();\r\n    <span class=\"hljs-keyword\">for<\/span> (Method method : methods)\r\n      methodNames.add(method.getName());\r\n    <span class=\"hljs-keyword\">return<\/span> methodNames;\r\n}<\/code><\/pre>\n<h2 data-id=\"Constructors\"><span class=\"ez-toc-section\" id=\"6_Inspecting_Constructors\"><\/span><strong>6. Inspecting Constructors<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Constructors\" class=\"bd-anchor\"><\/div>\n<p>With Java reflection, we can\u00a0<strong>inspect constructors<\/strong>\u00a0of any class and even\u00a0<strong>create class objects at runtime.<\/strong>\u00a0This is made possible by the\u00a0<em>java.lang.reflect.Constructor<\/em>\u00a0class.<\/p>\n<p>Earlier, we only looked at how to get the array of\u00a0<em>Constructor<\/em>\u00a0objects, from which we were able to get the names of the constructors.<\/p>\n<p>In this section, we will focus on how to retrieve specific constructors.<\/p>\n<p>In Java, as we know, no two constructors of a class share exactly the same method signature. So, we will use this uniqueness to get one constructor from many.<\/p>\n<p>To appreciate the features of this class, we will create a\u00a0<em>Bird<\/em>\u00a0subclass of\u00a0<em>Animal<\/em>\u00a0with three constructors.<\/p>\n<p>We will not implement\u00a0<em>Locomotion<\/em>\u00a0so that we can specify that behavior using a constructor argument, to add still more variety:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">Bird<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title class_\">Animal<\/span> {\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-type\">boolean<\/span> walks;\r\n\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title function_\">Bird<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-built_in\">super<\/span>(<span class=\"hljs-string\">\"bird\"<\/span>);\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title function_\">Bird<\/span><span class=\"hljs-params\">(String name, <span class=\"hljs-type\">boolean<\/span> walks)<\/span> {\r\n        <span class=\"hljs-built_in\">super<\/span>(name);\r\n        setWalks(walks);\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title function_\">Bird<\/span><span class=\"hljs-params\">(String name)<\/span> {\r\n        <span class=\"hljs-built_in\">super<\/span>(name);\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-title function_\">walks<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-keyword\">return<\/span> walks;\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/\/ standard setters and overridden methods<\/span>\r\n}<\/code><\/pre>\n<p>Let&#8217;s confirm by using reflection that this class has three constructors:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsAllConstructors_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    Constructor&lt;?&gt;[] constructors = birdClass.getConstructors();\r\n\r\n    assertEquals(<span class=\"hljs-number\">3<\/span>, constructors.length);\r\n}<\/code><\/pre>\n<p>Next, we will retrieve each constructor for the\u00a0<em>Bird<\/em>\u00a0class by passing the constructor&#8217;s parameter class types in declared order:<\/p>\n<div class=\"code-block code-block-10\">\n<div id=\"baeldung_incontent_6\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsEachConstructorByParamTypes_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n\r\n    Constructor&lt;?&gt; cons1 = birdClass.getConstructor();\r\n    Constructor&lt;?&gt; cons2 = birdClass.getConstructor(String.class);\r\n    Constructor&lt;?&gt; cons3 = birdClass.getConstructor(String.class, <span class=\"hljs-type\">boolean<\/span>.class);\r\n}<\/code><\/pre>\n<p>There is no need for assertion since we&#8217;ll get a\u00a0<em>NoSuchMethodException\u00a0<\/em>and the test will automatically fail when a constructor with given parameter types in the given order does not exist.<\/p>\n<p>In the last test, we&#8217;ll see how to instantiate objects at runtime while supplying their parameters:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenInstantiatesObjectsAtRuntime_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    Constructor&lt;?&gt; cons1 = birdClass.getConstructor();\r\n    Constructor&lt;?&gt; cons2 = birdClass.getConstructor(String.class);\r\n    Constructor&lt;?&gt; cons3 = birdClass.getConstructor(String.class,\r\n      <span class=\"hljs-type\">boolean<\/span>.class);\r\n\r\n    <span class=\"hljs-type\">Bird<\/span> <span class=\"hljs-variable\">bird1<\/span> <span class=\"hljs-operator\">=<\/span> (Bird) cons1.newInstance();\r\n    <span class=\"hljs-type\">Bird<\/span> <span class=\"hljs-variable\">bird2<\/span> <span class=\"hljs-operator\">=<\/span> (Bird) cons2.newInstance(<span class=\"hljs-string\">\"Weaver bird\"<\/span>);\r\n    <span class=\"hljs-type\">Bird<\/span> <span class=\"hljs-variable\">bird3<\/span> <span class=\"hljs-operator\">=<\/span> (Bird) cons3.newInstance(<span class=\"hljs-string\">\"dove\"<\/span>, <span class=\"hljs-literal\">true<\/span>);\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"bird\"<\/span>, bird1.getName());\r\n    assertEquals(<span class=\"hljs-string\">\"Weaver bird\"<\/span>, bird2.getName());\r\n    assertEquals(<span class=\"hljs-string\">\"dove\"<\/span>, bird3.getName());\r\n\r\n    assertFalse(bird1.walks());\r\n    assertTrue(bird3.walks());\r\n}<\/code><\/pre>\n<p>We instantiate class objects by calling the\u00a0<em>newInstance<\/em>\u00a0method of\u00a0<em>Constructor<\/em>\u00a0class and passing the required parameters in declared order. We then cast the result to the required type.<\/p>\n<p>It&#8217;s also possible to call the default constructor using the\u00a0<em>Class.newInstance()\u00a0<\/em>method. However, this method has been deprecated since Java 9, and we shouldn&#8217;t use it in modern Java projects.<\/p>\n<p>For\u00a0<em>bird1<\/em>, we use the default constructor that automatically sets the name to bird from our\u00a0<em>Bird<\/em>\u00a0code, and we confirm that with a test.<\/p>\n<p>We then instantiate\u00a0<em>bird2<\/em>\u00a0with only a name and test as well. Remember that when we don&#8217;t set locomotion behavior, it defaults to false as seen in the last two assertions.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/bit.ly\/3ELmCiA\" target=\"_blank\" rel=\"noopener\"><strong>Learn to code from industry experts! Enroll here<\/strong><\/a><\/p>\n<h2 data-id=\"Fields\"><span class=\"ez-toc-section\" id=\"7_Inspecting_Fields\"><\/span><strong>7. Inspecting Fields<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Fields\" class=\"bd-anchor\"><\/div>\n<p>Previously, we only inspected the names of fields. In this section,\u00a0<strong>we will show how to<\/strong>\u00a0<strong>get and set their values at runtime.<\/strong><\/p>\n<p>There are two main methods used to inspect fields of a class at runtime:\u00a0<em>getFields()<\/em>\u00a0and\u00a0<em>getField(fieldName)<\/em>.<\/p>\n<div class=\"code-block code-block-11\">\n<div id=\"baeldung_incontent_7\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<p>The\u00a0<em>getFields()<\/em>\u00a0method returns all accessible public fields of the class in question. It will return all the public fields in both the class and all superclasses.<\/p>\n<p>For instance, when we call this method on the\u00a0<em>Bird<\/em>\u00a0class, we will only get the\u00a0<em>CATEGORY<\/em>\u00a0field of its superclass,\u00a0<em>Animal<\/em>, since\u00a0<em>Bird<\/em>\u00a0itself does not declare any public fields:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsPublicFields_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    Field[] fields = birdClass.getFields();\r\n\r\n    assertEquals(<span class=\"hljs-number\">1<\/span>, fields.length);\r\n    assertEquals(<span class=\"hljs-string\">\"CATEGORY\"<\/span>, fields[<span class=\"hljs-number\">0<\/span>].getName());\r\n}<\/code><\/pre>\n<p>This method also has a variant called\u00a0<em>getField<\/em>\u00a0that returns only one\u00a0<em>Field<\/em>\u00a0object by taking the name of the field:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsPublicFieldByName_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    <span class=\"hljs-type\">Field<\/span> <span class=\"hljs-variable\">field<\/span> <span class=\"hljs-operator\">=<\/span> birdClass.getField(<span class=\"hljs-string\">\"CATEGORY\"<\/span>);\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"CATEGORY\"<\/span>, field.getName());\r\n}<\/code><\/pre>\n<p>We are not able to access private fields declared in superclasses and not declared in the child class. This is why we can&#8217;t access the\u00a0<em>name<\/em>\u00a0field.<\/p>\n<p>However, we can inspect private fields declared in the class we are dealing with by calling the\u00a0<em>getDeclaredFields<\/em>\u00a0method:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsDeclaredFields_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    Field[] fields = birdClass.getDeclaredFields();\r\n\r\n    assertEquals(<span class=\"hljs-number\">1<\/span>, fields.length);\r\n    assertEquals(<span class=\"hljs-string\">\"walks\"<\/span>, fields[<span class=\"hljs-number\">0<\/span>].getName());\r\n}<\/code><\/pre>\n<p>We can also use its other variant in case we know the name of the field:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsFieldsByName_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    <span class=\"hljs-type\">Field<\/span> <span class=\"hljs-variable\">field<\/span> <span class=\"hljs-operator\">=<\/span> birdClass.getDeclaredField(<span class=\"hljs-string\">\"walks\"<\/span>);\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"walks\"<\/span>, field.getName());\r\n}<\/code><\/pre>\n<p>If we get the name of the field wrong or type in an nonexistent field, we&#8217;ll get a\u00a0<em>NoSuchFieldException<\/em>.<\/p>\n<p>Now we&#8217;ll get the field type:<\/p>\n<div class=\"code-block code-block-12\">\n<div id=\"baeldung_incontent_8\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClassField_whenGetsType_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    <span class=\"hljs-type\">Field<\/span> <span class=\"hljs-variable\">field<\/span> <span class=\"hljs-operator\">=<\/span> Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>)\r\n      .getDeclaredField(<span class=\"hljs-string\">\"walks\"<\/span>);\r\n    Class&lt;?&gt; fieldClass = field.getType();\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"boolean\"<\/span>, fieldClass.getSimpleName());\r\n}<\/code><\/pre>\n<p>Next, let&#8217;s look at how to access field values and modify them.<\/p>\n<p>To get the value of a field, let alone set it, we have to first set it&#8217;s accessible by calling\u00a0<em>setAccessible<\/em>\u00a0method on the\u00a0<em>Field<\/em>\u00a0object and pass boolean\u00a0<em>true<\/em>\u00a0to it:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClassField_whenSetsAndGetsValue_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    <span class=\"hljs-type\">Bird<\/span> <span class=\"hljs-variable\">bird<\/span> <span class=\"hljs-operator\">=<\/span> (Bird) birdClass.getConstructor().newInstance();\r\n    <span class=\"hljs-type\">Field<\/span> <span class=\"hljs-variable\">field<\/span> <span class=\"hljs-operator\">=<\/span> birdClass.getDeclaredField(<span class=\"hljs-string\">\"walks\"<\/span>);\r\n    field.setAccessible(<span class=\"hljs-literal\">true<\/span>);\r\n\r\n    assertFalse(field.getBoolean(bird));\r\n    assertFalse(bird.walks());\r\n    \r\n    field.set(bird, <span class=\"hljs-literal\">true<\/span>);\r\n    \r\n    assertTrue(field.getBoolean(bird));\r\n    assertTrue(bird.walks());\r\n}<\/code><\/pre>\n<p>In the above test, we ascertain that indeed the value of the\u00a0<em>walks<\/em>\u00a0field is false before setting it to true.<\/p>\n<p>Notice how we use the\u00a0<em>Field<\/em>\u00a0object to set and get values by passing it the instance of the class we are dealing with and possibly the new value we want the field to have in that object.<\/p>\n<p>One important thing to note about\u00a0<em>Field<\/em>\u00a0objects is that when it is declared as\u00a0<em>public static<\/em>, we don&#8217;t need an instance of the class containing them.<\/p>\n<p>We can just pass\u00a0<em>null<\/em>\u00a0in its place and still obtain the default value of the field:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClassField_whenGetsAndSetsWithNull_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    <span class=\"hljs-type\">Field<\/span> <span class=\"hljs-variable\">field<\/span> <span class=\"hljs-operator\">=<\/span> birdClass.getField(<span class=\"hljs-string\">\"CATEGORY\"<\/span>);\r\n    field.setAccessible(<span class=\"hljs-literal\">true<\/span>);\r\n\r\n    assertEquals(<span class=\"hljs-string\">\"domestic\"<\/span>, field.get(<span class=\"hljs-literal\">null<\/span>));\r\n}<\/code><\/pre>\n<h2 data-id=\"Methods\"><span class=\"ez-toc-section\" id=\"8_Inspecting_Methods\"><\/span><strong>8. Inspecting Methods<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Methods\" class=\"bd-anchor\"><\/div>\n<p>In a previous example, we used reflection only to inspect method names. However, Java reflection is more powerful than that.<\/p>\n<p>With Java reflection, we can\u00a0<strong>invoke methods at\u00a0<\/strong><b>runtime<\/b>\u00a0and pass them their required parameters, just like we did for constructors. Similarly, we can also invoke overloaded methods by specifying parameter types of each.<\/p>\n<div class=\"code-block code-block-13\">\n<div id=\"baeldung_incontent_9\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<p>Just like fields, there are two main methods that we use for retrieving class methods. The\u00a0<em>getMethods<\/em>\u00a0method returns an array of all public methods of the class and superclasses.<\/p>\n<p>This means that with this method, we can get public methods of the\u00a0<em>java.lang.Object<\/em>\u00a0class such as\u00a0<em>toString<\/em>,\u00a0<em>hashCode<\/em>\u00a0and\u00a0<em>notifyAll<\/em>:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsAllPublicMethods_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    Method[] methods = birdClass.getMethods();\r\n    List&lt;String&gt; methodNames = getMethodNames(methods);\r\n\r\n    assertTrue(methodNames.containsAll(Arrays\r\n      .asList(<span class=\"hljs-string\">\"equals\"<\/span>, <span class=\"hljs-string\">\"notifyAll\"<\/span>, <span class=\"hljs-string\">\"hashCode\"<\/span>,\r\n        <span class=\"hljs-string\">\"walks\"<\/span>, <span class=\"hljs-string\">\"eats\"<\/span>, <span class=\"hljs-string\">\"toString\"<\/span>)));\r\n}<\/code><\/pre>\n<p>To get only public methods of the class we are interested in, we have to use\u00a0<em>getDeclaredMethods<\/em>\u00a0method:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenClass_whenGetsOnlyDeclaredMethods_thenCorrect<\/span><span class=\"hljs-params\">()<\/span>{\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    List&lt;String&gt; actualMethodNames\r\n      = getMethodNames(birdClass.getDeclaredMethods());\r\n\r\n    List&lt;String&gt; expectedMethodNames = Arrays\r\n      .asList(<span class=\"hljs-string\">\"setWalks\"<\/span>, <span class=\"hljs-string\">\"walks\"<\/span>, <span class=\"hljs-string\">\"getSound\"<\/span>, <span class=\"hljs-string\">\"eats\"<\/span>);\r\n\r\n    assertEquals(expectedMethodNames.size(), actualMethodNames.size());\r\n    assertTrue(expectedMethodNames.containsAll(actualMethodNames));\r\n    assertTrue(actualMethodNames.containsAll(expectedMethodNames));\r\n}<\/code><\/pre>\n<p>Each of these methods has the singular variation that returns a single\u00a0<em>Method<\/em>\u00a0object whose name we know:<\/p>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenMethodName_whenGetsMethod_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> Exception {\r\n    <span class=\"hljs-type\">Bird<\/span> <span class=\"hljs-variable\">bird<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Bird<\/span>();\r\n    <span class=\"hljs-type\">Method<\/span> <span class=\"hljs-variable\">walksMethod<\/span> <span class=\"hljs-operator\">=<\/span> bird.getClass().getDeclaredMethod(<span class=\"hljs-string\">\"walks\"<\/span>);\r\n    <span class=\"hljs-type\">Method<\/span> <span class=\"hljs-variable\">setWalksMethod<\/span> <span class=\"hljs-operator\">=<\/span> bird.getClass().getDeclaredMethod(<span class=\"hljs-string\">\"setWalks\"<\/span>, <span class=\"hljs-type\">boolean<\/span>.class);\r\n\r\n    assertTrue(walksMethod.canAccess(bird));\r\n    assertTrue(setWalksMethod.canAccess(bird));\r\n}<\/code><\/pre>\n<p>Notice how we retrieve individual methods and specify what parameter types they take. Those that don&#8217;t take parameter types are retrieved with an empty variable argument, leaving us with only a single argument, the method name.<\/p>\n<p>Next, we will show how to invoke a method at runtime.<\/p>\n<p>We know by default that the\u00a0<em>walks<\/em>\u00a0attribute of the\u00a0<em>Bird<\/em>\u00a0class is\u00a0<em>false<\/em>.<\/p>\n<p>We want to call its\u00a0<em>setWalks<\/em>\u00a0method and set it to\u00a0<em>true<\/em>:<\/p>\n<div class=\"code-block code-block-14\">\n<div id=\"baeldung_incontent_10\" align=\"center\" data-freestar-ad=\"__336x280 __336x280\"><\/div>\n<\/div>\n<pre><code class=\"language-java hljs\"><span class=\"hljs-meta\">@Test<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">givenMethod_whenInvokes_thenCorrect<\/span><span class=\"hljs-params\">()<\/span> {\r\n    Class&lt;?&gt; birdClass = Class.forName(<span class=\"hljs-string\">\"com.baeldung.reflection.Bird\"<\/span>);\r\n    <span class=\"hljs-type\">Bird<\/span> <span class=\"hljs-variable\">bird<\/span> <span class=\"hljs-operator\">=<\/span> (Bird) birdClass.getConstructor().newInstance();\r\n    <span class=\"hljs-type\">Method<\/span> <span class=\"hljs-variable\">setWalksMethod<\/span> <span class=\"hljs-operator\">=<\/span> birdClass.getDeclaredMethod(<span class=\"hljs-string\">\"setWalks\"<\/span>, <span class=\"hljs-type\">boolean<\/span>.class);\r\n    <span class=\"hljs-type\">Method<\/span> <span class=\"hljs-variable\">walksMethod<\/span> <span class=\"hljs-operator\">=<\/span> birdClass.getDeclaredMethod(<span class=\"hljs-string\">\"walks\"<\/span>);\r\n    <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-variable\">walks<\/span> <span class=\"hljs-operator\">=<\/span> (<span class=\"hljs-type\">boolean<\/span>) walksMethod.invoke(bird);\r\n\r\n    assertFalse(walks);\r\n    assertFalse(bird.walks());\r\n\r\n    setWalksMethod.invoke(bird, <span class=\"hljs-literal\">true<\/span>);\r\n\r\n    <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-variable\">walks2<\/span> <span class=\"hljs-operator\">=<\/span> (<span class=\"hljs-type\">boolean<\/span>) walksMethod.invoke(bird);\r\n    assertTrue(walks2);\r\n    assertTrue(bird.walks());\r\n}<\/code><\/pre>\n<p>Notice how we first invoke the\u00a0<em>walks<\/em>\u00a0method and cast the return type to the appropriate data type and then check its value. We later invoke the\u00a0<em>setWalks<\/em>\u00a0method to change that value and test again.<\/p>\n<h2 class=\"h1\"><span class=\"ez-toc-section\" id=\"Reflection_API_in_JAVA\"><\/span><strong>Reflection API in JAVA<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><strong>Java Reflection<\/strong>\u00a0is a\u00a0<i>process of examining or modifying the run time behavior of a class at run time<\/i>.<\/p>\n<p>The\u00a0<strong>java.lang.Class<\/strong>\u00a0class provides many methods that can be used to get metadata, examine and change the run time behavior of a class.<\/p>\n<p>The java.lang and java.lang.reflect packages provide classes for java reflection.<\/p>\n<h3 class=\"h4\"><strong>Where it is used<\/strong><\/h3>\n<p>The Reflection API in JAVA is mainly used in:<\/p>\n<ul class=\"points\">\n<li>IDE (Integrated Development Environment) e.g., Eclipse, MyEclipse, NetBeans etc.<\/li>\n<li>Debugger<\/li>\n<li>Test Tools etc.<\/li>\n<\/ul>\n<h2 data-id=\"Conclusion\"><span class=\"ez-toc-section\" id=\"9_Conclusion\"><\/span><strong>9. Conclusion<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"Conclusion\" class=\"bd-anchor\"><\/div>\n<p>In this article, we covered the Java Reflection API and looked at how to use it to inspect classes, interfaces, fields and methods at runtime without prior knowledge of their internals by compile time.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/bit.ly\/3ELmCiA\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-25520910 size-full\" src=\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square.png\" alt=\"Python and Machine Learning Square\" width=\"345\" height=\"345\" srcset=\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square.png 345w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-300x300.png 300w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-150x150.png 150w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-24x24.png 24w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-48x48.png 48w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-96x96.png 96w, https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/04\/Python-and-Machine-Learning-Square-75x75.png 75w\" sizes=\"auto, (max-width: 345px) 100vw, 345px\" \/><\/a><strong><a href=\"https:\/\/bit.ly\/3ELmCiA\" target=\"_blank\" rel=\"noopener\">Learn Coding in your Language! Enroll Here!<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reflection API in JAVA is an API that is used to examine or modify the behavior of methods, classes, and interfaces at runtime. The required classes for reflection are provided under java.lang.reflect package which is essential in order to understand reflection. 1. Overview In this tutorial, we will explore Java reflection, which allows us to [&hellip;]<\/p>\n","protected":false},"author":111,"featured_media":25531567,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[802,1882],"tags":[],"class_list":["post-25531279","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articles","category-java-programming"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Use Reflection in Java? A Guide - Entri Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Use Reflection in Java? A Guide - Entri Blog\" \/>\n<meta property=\"og:description\" content=\"Reflection API in JAVA is an API that is used to examine or modify the behavior of methods, classes, and interfaces at runtime. The required classes for reflection are provided under java.lang.reflect package which is essential in order to understand reflection. 1. Overview In this tutorial, we will explore Java reflection, which allows us to [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Entri Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/entri.me\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-02T17:41:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-23T09:50:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png\" \/>\n\t<meta property=\"og:image:width\" content=\"820\" \/>\n\t<meta property=\"og:image:height\" content=\"615\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Feeba Mahin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@entri_app\" \/>\n<meta name=\"twitter:site\" content=\"@entri_app\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Feeba Mahin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/\"},\"author\":{\"name\":\"Feeba Mahin\",\"@id\":\"https:\/\/entri.app\/blog\/#\/schema\/person\/f036dab84abae3dcc9390a1110d95d36\"},\"headline\":\"How to Use Reflection in Java? A Guide\",\"datePublished\":\"2022-07-02T17:41:52+00:00\",\"dateModified\":\"2022-11-23T09:50:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/\"},\"wordCount\":2447,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/entri.app\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png\",\"articleSection\":[\"Articles\",\"Java Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/\",\"url\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/\",\"name\":\"How to Use Reflection in Java? A Guide - Entri Blog\",\"isPartOf\":{\"@id\":\"https:\/\/entri.app\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png\",\"datePublished\":\"2022-07-02T17:41:52+00:00\",\"dateModified\":\"2022-11-23T09:50:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#primaryimage\",\"url\":\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png\",\"contentUrl\":\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png\",\"width\":820,\"height\":615,\"caption\":\"How to Use Reflection in Java A Guide\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/entri.app\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Entri Skilling\",\"item\":\"https:\/\/entri.app\/blog\/category\/entri-skilling\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Java Programming\",\"item\":\"https:\/\/entri.app\/blog\/category\/entri-skilling\/java-programming\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"How to Use Reflection in Java? A Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/entri.app\/blog\/#website\",\"url\":\"https:\/\/entri.app\/blog\/\",\"name\":\"Entri Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/entri.app\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/entri.app\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/entri.app\/blog\/#organization\",\"name\":\"Entri App\",\"url\":\"https:\/\/entri.app\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/entri.app\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2019\/10\/Entri-Logo-1.png\",\"contentUrl\":\"https:\/\/entri.app\/blog\/wp-content\/uploads\/2019\/10\/Entri-Logo-1.png\",\"width\":989,\"height\":446,\"caption\":\"Entri App\"},\"image\":{\"@id\":\"https:\/\/entri.app\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/entri.me\/\",\"https:\/\/x.com\/entri_app\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/entri.app\/blog\/#\/schema\/person\/f036dab84abae3dcc9390a1110d95d36\",\"name\":\"Feeba Mahin\",\"url\":\"https:\/\/entri.app\/blog\/author\/feeba123\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Use Reflection in Java? A Guide - Entri Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/","og_locale":"en_US","og_type":"article","og_title":"How to Use Reflection in Java? A Guide - Entri Blog","og_description":"Reflection API in JAVA is an API that is used to examine or modify the behavior of methods, classes, and interfaces at runtime. The required classes for reflection are provided under java.lang.reflect package which is essential in order to understand reflection. 1. Overview In this tutorial, we will explore Java reflection, which allows us to [&hellip;]","og_url":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/","og_site_name":"Entri Blog","article_publisher":"https:\/\/www.facebook.com\/entri.me\/","article_published_time":"2022-07-02T17:41:52+00:00","article_modified_time":"2022-11-23T09:50:13+00:00","og_image":[{"width":820,"height":615,"url":"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png","type":"image\/png"}],"author":"Feeba Mahin","twitter_card":"summary_large_image","twitter_creator":"@entri_app","twitter_site":"@entri_app","twitter_misc":{"Written by":"Feeba Mahin","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#article","isPartOf":{"@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/"},"author":{"name":"Feeba Mahin","@id":"https:\/\/entri.app\/blog\/#\/schema\/person\/f036dab84abae3dcc9390a1110d95d36"},"headline":"How to Use Reflection in Java? A Guide","datePublished":"2022-07-02T17:41:52+00:00","dateModified":"2022-11-23T09:50:13+00:00","mainEntityOfPage":{"@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/"},"wordCount":2447,"commentCount":0,"publisher":{"@id":"https:\/\/entri.app\/blog\/#organization"},"image":{"@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png","articleSection":["Articles","Java Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/","url":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/","name":"How to Use Reflection in Java? A Guide - Entri Blog","isPartOf":{"@id":"https:\/\/entri.app\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#primaryimage"},"image":{"@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png","datePublished":"2022-07-02T17:41:52+00:00","dateModified":"2022-11-23T09:50:13+00:00","breadcrumb":{"@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#primaryimage","url":"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png","contentUrl":"https:\/\/entri.app\/blog\/wp-content\/uploads\/2022\/06\/How-to-Use-Reflection-in-Java-A-Guide.png","width":820,"height":615,"caption":"How to Use Reflection in Java A Guide"},{"@type":"BreadcrumbList","@id":"https:\/\/entri.app\/blog\/how-to-use-reflection-in-java-a-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/entri.app\/blog\/"},{"@type":"ListItem","position":2,"name":"Entri Skilling","item":"https:\/\/entri.app\/blog\/category\/entri-skilling\/"},{"@type":"ListItem","position":3,"name":"Java Programming","item":"https:\/\/entri.app\/blog\/category\/entri-skilling\/java-programming\/"},{"@type":"ListItem","position":4,"name":"How to Use Reflection in Java? A Guide"}]},{"@type":"WebSite","@id":"https:\/\/entri.app\/blog\/#website","url":"https:\/\/entri.app\/blog\/","name":"Entri Blog","description":"","publisher":{"@id":"https:\/\/entri.app\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/entri.app\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/entri.app\/blog\/#organization","name":"Entri App","url":"https:\/\/entri.app\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/entri.app\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/entri.app\/blog\/wp-content\/uploads\/2019\/10\/Entri-Logo-1.png","contentUrl":"https:\/\/entri.app\/blog\/wp-content\/uploads\/2019\/10\/Entri-Logo-1.png","width":989,"height":446,"caption":"Entri App"},"image":{"@id":"https:\/\/entri.app\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/entri.me\/","https:\/\/x.com\/entri_app"]},{"@type":"Person","@id":"https:\/\/entri.app\/blog\/#\/schema\/person\/f036dab84abae3dcc9390a1110d95d36","name":"Feeba Mahin","url":"https:\/\/entri.app\/blog\/author\/feeba123\/"}]}},"_links":{"self":[{"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/posts\/25531279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/users\/111"}],"replies":[{"embeddable":true,"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/comments?post=25531279"}],"version-history":[{"count":7,"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/posts\/25531279\/revisions"}],"predecessor-version":[{"id":25548028,"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/posts\/25531279\/revisions\/25548028"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/media\/25531567"}],"wp:attachment":[{"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/media?parent=25531279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/categories?post=25531279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/entri.app\/blog\/wp-json\/wp\/v2\/tags?post=25531279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}