java反射, 不看你可别后悔

<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>&lt;?&gt; 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&lt;?&gt; <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>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

AndroidStudio封装SDK的那些事

<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael

Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory

<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,

Spring Boot 2下使用Feign找不到@EnableFeignClients的解决办法

<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2