<div id="content\_views" class="markdown\_views"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p>开发中, 难免遇到些私有的属性和方法, 就好比下面的实体一样, 我们该怎么获得<code>她</code>, 并玩弄于手掌呢? </p> <p>我们先来个实体瞧瞧, 给你个对象你也new不了, hahaha… 单身wang</p> <pre class="prettyprint" name="code"><code class="hljs cs has-numbering" onclick="mdcp.signin(event)" style="position: unset;"><span class="hljs-keyword"><span class="hljs-keyword">public</span></span> <span class="hljs-keyword"><span class="hljs-keyword">class</span></span> <span class="hljs-title">Student</span> { <span class="hljs-keyword"><span class="hljs-keyword">private</span></span> String name; <span class="hljs-keyword"><span class="hljs-keyword">private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> age; <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">private</span></span></span><span class="hljs-function"> </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">Student</span></span></span><span class="hljs-function">(<span class="hljs-params">String name, </span></span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword">int</span></span></span></span><span class="hljs-function"><span class="hljs-params"> age</span>) </span>{ <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.name = name; <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.age = age; } <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span><span class="hljs-function"> </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">Student</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>)</span>{ <span class="hljs-keyword"><span class="hljs-keyword">throw</span></span> <span class="hljs-keyword"><span class="hljs-keyword">new</span></span> IllegalAccessError(<span class="hljs-string"><span class="hljs-string">"就不给你创建"</span></span>); } <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">private</span></span></span><span class="hljs-function"> String </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">getName</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword"><span class="hljs-keyword">return</span></span> name == <span class="hljs-keyword"><span class="hljs-literal">null</span></span> ? <span class="hljs-string"><span class="hljs-string">""</span></span> : name; } <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">private</span></span></span><span class="hljs-function"> </span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span></span></span><span class="hljs-function"> </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">setName</span></span></span><span class="hljs-function">(<span class="hljs-params">String name</span>) </span>{ <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.name = name; } <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span><span class="hljs-function"> </span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">int</span></span></span><span class="hljs-function"> </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">getAge</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword"><span class="hljs-keyword">return</span></span> age; } <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span><span class="hljs-function"> </span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span></span></span><span class="hljs-function"> </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">setAge</span></span></span><span class="hljs-function">(</span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword">int</span></span></span></span><span class="hljs-function"><span class="hljs-params"> age</span>) </span>{ <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.age = age; } @<span class="hljs-function">Override </span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span><span class="hljs-function"> String </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">toString</span></span></span><span class="hljs-function">(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-string"><span class="hljs-string">"Student{"</span></span> + <span class="hljs-string"><span class="hljs-string">"name='"</span></span> + name + <span class="hljs-string"><span class="hljs-string">'\\''</span></span> + <span class="hljs-string"><span class="hljs-string">", age="</span></span> + age + <span class="hljs-string"><span class="hljs-string">'}'</span></span>; } }<div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <blockquote> <p>在反射中如果是私有的, 不管是私有方法, 还是私有属性, 都必须在操作前设置setAccessible为false. 你要不设, 就等着GG呗!</p> </blockquote> <h2 id="反射步骤"><a name="t0"></a>反射步骤</h2> <h3 id="1-首先我们要找到要操作的对象"><a name="t1"></a>1. 首先我们要找到要操作的<code>对象</code></h3> <blockquote> <p>通过Class.forName(“…”), 找到你对象, 里面就写 <code>包名+对象名</code>, 后缀就算了, 谁不知道是个女的啊!</p> </blockquote> <pre class="prettyprint" name="code"><code class="hljs vbnet has-numbering" onclick="mdcp.signin(event)" style="position: unset;"><span class="hljs-keyword"><span class="hljs-keyword">Class</span></span><?> clz = <span class="hljs-keyword"><span class="hljs-keyword">Class</span></span>.forName(<span class="hljs-string"><span class="hljs-string">"top.huiger.Student"</span></span>);<div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <h3 id="2-找到对象在哪了-但是我们还没找到创建的构造方法是不行的-关于找哪个构造方法-自己选择-自己的对象自己找"><a name="t2"></a>2. 找到对象在哪了, 但是我们还没找到创建的构造方法是不行的, 关于找哪个构造方法, 自己选择, 自己的对象自己找.</h3> <pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering dart" onclick="mdcp.signin(event)" style="position: unset;"><span class="hljs-keyword">clz</span><span class="hljs-preprocessor">.getDeclaredConstructor</span>(<span class="hljs-built\_in">String</span><span class="hljs-preprocessor">.<span class="hljs-keyword">class</span></span>, <span class="hljs-built\_in">int</span><span class="hljs-preprocessor">.<span class="hljs-keyword">class</span></span>)<span class="hljs-comment">;</span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <h3 id="3-那我们来创建她-记得上面的找的构造方法是什么-要匹配上才行"><a name="t3"></a>3. 那我们来创建<code>她</code>, 记得上面的找的构造方法是什么, 要匹配上才行.</h3> <pre class="prettyprint" name="code"><code class="hljs delphi has-numbering" onclick="mdcp.signin(event)" style="position: unset;"><span class="hljs-keyword"><span class="hljs-keyword">Object</span></span> student = <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">constructor</span></span></span><span class="hljs-function">.</span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">newInstance</span></span></span><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">("张三", 18)</span></span></span><span class="hljs-function">;</span></span> <span class="hljs-comment"><span class="hljs-comment">// 张三还是如花 看你爱好</span></span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <h3 id="4-找到对象了-我们来调用下-但是公开的和私有的又有区别"><a name="t4"></a>4. 找到对象了, 我们来调用下, 但是公开的和私有的又有区别</h3> <p></p><ul> <br> <li>公开 <br></li></ul><p></p> <blockquote> clz.getMethod(“getAge”); </blockquote> <pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering go" onclick="mdcp.signin(event)" style="position: unset;">Method getAge = <span class="hljs-keyword">clz</span><span class="hljs-preprocessor">.getMethod</span>(<span class="hljs-string"><span class="hljs-string">"getAge"</span></span>)<span class="hljs-comment">;</span> System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.<span class="hljs-built\_in">println</span></span>(<span class="hljs-string"><span class="hljs-string">"--------------"</span></span> + getAge<span class="hljs-preprocessor">.invoke</span>(student))<span class="hljs-comment">;</span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <p></p><ul> <br> <li>私有 <br></li></ul><p></p> <blockquote> clz.getDeclaredMethod(“getName”);, 上面说过, 私有的都要设置可修改的权限 </blockquote> <pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering vhdl" onclick="mdcp.signin(event)" style="position: unset;">Method getName = <span class="hljs-keyword">clz</span><span class="hljs-preprocessor">.getDeclaredMethod</span>(<span class="hljs-string"><span class="hljs-string">"getName"</span></span>)<span class="hljs-comment">;</span> getName<span class="hljs-preprocessor">.setAccessible</span>(<span class="hljs-literal">true</span>)<span class="hljs-comment">;</span> <span class="hljs-built\_in">String</span> name = (<span class="hljs-built\_in">String</span>) getName<span class="hljs-preprocessor">.invoke</span>(student)<span class="hljs-comment">;</span> System<span class="hljs-preprocessor">.<span class="hljs-keyword">out</span></span><span class="hljs-preprocessor">.println</span>(<span class="hljs-string"><span class="hljs-string">"--------------"</span></span> + name)<span class="hljs-comment">;</span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <h3 id="5-修改属性-和调用方法类似"><a name="t5"></a>5. 修改属性, 和调用方法类似</h3> <pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering cs" onclick="mdcp.signin(event)" style="position: unset;"><span class="hljs-comment">// 找到私有属性</span> Field age = <span class="hljs-keyword">clz</span><span class="hljs-preprocessor">.getDeclaredField</span>(<span class="hljs-string"><span class="hljs-string">"age"</span></span>)<span class="hljs-comment">;</span> age<span class="hljs-preprocessor">.setAccessible</span>(<span class="hljs-literal">true</span>)<span class="hljs-comment">;</span> age<span class="hljs-preprocessor">.setInt</span>(student, <span class="hljs-number"><span class="hljs-number">20</span></span>)<span class="hljs-comment">; <span class="hljs-comment">// 修改属性</span></span> System<span class="hljs-preprocessor">.<span class="hljs-keyword">out</span></span><span class="hljs-preprocessor">.println</span>(<span class="hljs-string"><span class="hljs-string">"--------------"</span></span>+age<span class="hljs-preprocessor">.<span class="hljs-keyword">get</span></span>(student))<span class="hljs-comment">;</span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <h2 id="全部演练代码都在这"><a name="t6"></a>全部演练代码都在这</h2> <pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering dart" onclick="mdcp.signin(event)" style="position: unset;">Class<?> <span class="hljs-keyword">clz</span> = Class<span class="hljs-preprocessor">.forName</span>(<span class="hljs-string"><span class="hljs-string">"top.huiger.Student"</span></span>)<span class="hljs-comment">;</span> <span class="hljs-comment">// 找到带有这个参数的构造方法</span> Constructor constructor = <span class="hljs-keyword">clz</span><span class="hljs-preprocessor">.getDeclaredConstructor</span>(<span class="hljs-built\_in">String</span><span class="hljs-preprocessor">.<span class="hljs-keyword">class</span></span>, <span class="hljs-built\_in">int</span><span class="hljs-preprocessor">.<span class="hljs-keyword">class</span></span>)<span class="hljs-comment">;</span> constructor<span class="hljs-preprocessor">.setAccessible</span>(<span class="hljs-keyword">true</span>)<span class="hljs-comment">;</span> <span class="hljs-comment">// 初始化对象</span> <span class="hljs-built\_in">Object</span> student = constructor<span class="hljs-preprocessor">.newInstance</span>(<span class="hljs-string"><span class="hljs-string">"张三"</span></span>, <span class="hljs-number"><span class="hljs-number">18</span></span>)<span class="hljs-comment">;</span> System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(<span class="hljs-string"><span class="hljs-string">"--------------"</span></span>+constructor<span class="hljs-preprocessor">.toString</span>())<span class="hljs-comment">;</span> <span class="hljs-comment">// 找到该私有方法</span> Method getName = <span class="hljs-keyword">clz</span><span class="hljs-preprocessor">.getDeclaredMethod</span>(<span class="hljs-string"><span class="hljs-string">"getName"</span></span>)<span class="hljs-comment">;</span> getName<span class="hljs-preprocessor">.setAccessible</span>(<span class="hljs-keyword">true</span>)<span class="hljs-comment">;</span> <span class="hljs-built\_in">String</span> name = (<span class="hljs-built\_in">String</span>) getName<span class="hljs-preprocessor">.invoke</span>(student)<span class="hljs-comment">;</span> System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(<span class="hljs-string"><span class="hljs-string">"--------------"</span></span>+name)<span class="hljs-comment">;</span> <span class="hljs-comment">// 找到私有属性</span> Field age = <span class="hljs-keyword">clz</span><span class="hljs-preprocessor">.getDeclaredField</span>(<span class="hljs-string"><span class="hljs-string">"age"</span></span>)<span class="hljs-comment">;</span> age<span class="hljs-preprocessor">.setAccessible</span>(<span class="hljs-keyword">true</span>)<span class="hljs-comment">;</span> age<span class="hljs-preprocessor">.setInt</span>(student, <span class="hljs-number"><span class="hljs-number">20</span></span>)<span class="hljs-comment">; <span class="hljs-comment">// 修改属性</span></span> System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(<span class="hljs-string"><span class="hljs-string">"--------------"</span></span>+age<span class="hljs-preprocessor">.<span class="hljs-keyword">get</span></span>(student))<span class="hljs-comment">;</span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> <p>最后输出</p> <pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering css" onclick="mdcp.signin(event)" style="position: unset;"><span class="hljs-selector-tag">--------------private</span> <span class="hljs-keyword"><span class="hljs-selector-tag">com</span></span><span class="hljs-preprocessor"><span class="hljs-selector-class">.dong</span></span><span class="hljs-preprocessor"><span class="hljs-selector-class">.wine</span></span><span class="hljs-preprocessor"><span class="hljs-selector-class">.Student</span></span>(<span class="hljs-selector-tag">java</span><span class="hljs-preprocessor"><span class="hljs-selector-class">.lang</span></span><span class="hljs-preprocessor"><span class="hljs-selector-class">.String</span></span>,<span class="hljs-selector-tag">int</span>) <span class="hljs-selector-tag">--------------</span>张三 <span class="hljs-selector-tag">--------------</span><span class="hljs-number"><span class="hljs-selector-tag">20</span></span><div class="hljs-button signin" data-title="登录后复制"></div></code></pre> 原文地址:https://blog.csdn.net/zhihui\_520/article/details/80136598 </div>