﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-重剑无锋-文章分类-java</title><link>http://www.blogjava.net/morgan/category/52603.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 13 Sep 2012 16:25:19 GMT</lastBuildDate><pubDate>Thu, 13 Sep 2012 16:25:19 GMT</pubDate><ttl>60</ttl><item><title>java反射调用main方法，private方法实现</title><link>http://www.blogjava.net/morgan/articles/reflection.html</link><dc:creator>morgan</dc:creator><author>morgan</author><pubDate>Wed, 12 Sep 2012 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/morgan/articles/reflection.html</guid><wfw:comment>http://www.blogjava.net/morgan/comments/387590.html</wfw:comment><comments>http://www.blogjava.net/morgan/articles/reflection.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morgan/comments/commentRss/387590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morgan/services/trackbacks/387590.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp;最近研究jetty源代码的时候，发现这个容器里面的代码根本无法看懂，都是java语法，基本上都是反射+设计模式+配置文件。很莫名奇妙的方法调用。里面有调用main方法的反射，结果没看懂，所以就再来研究研究反射功能。由于反射的文章在网上太多了，我主要研究了一下main方法，private方法的调用。如下，反射调用HelloWorld类的方法。HelloWorld类如下：<br />&nbsp; &nbsp;<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">class</span>&nbsp;HelloWorld&nbsp;{&nbsp;<br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("HelloWorld");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;prt(String&nbsp;msg){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>&nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp;调用main方法如下：<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">class</span>&nbsp;HelloWorldRefection&nbsp;{&nbsp;<br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InstantiationException,&nbsp;IllegalAccessException,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecurityException,&nbsp;NoSuchMethodException,&nbsp;IllegalArgumentException,&nbsp;InvocationTargetException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;=&nbsp;HelloWorld.<span style="color: #0000FF; ">class</span>.getMethod("main",String[].<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(<span style="color: #0000FF; ">null</span>,(Object)<span style="color: #0000FF; ">new</span>&nbsp;String[]{});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>&nbsp; &nbsp; &nbsp;调用private方法如下:<br />&nbsp; &nbsp;&nbsp;<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; ">&nbsp;<span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">class</span>&nbsp;HelloWorldRefection&nbsp;{&nbsp;<br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InstantiationException,&nbsp;IllegalAccessException,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SecurityException,&nbsp;NoSuchMethodException,&nbsp;IllegalArgumentException,&nbsp;InvocationTargetException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;clazz&nbsp;=&nbsp;HelloWorld.<span style="color: #0000FF; ">class</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorld&nbsp;helloworld&nbsp;=&nbsp;HelloWorld.<span style="color: #0000FF; ">class</span>.newInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method[]&nbsp;methods&nbsp;=&nbsp;clazz.getDeclaredMethods();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Method&nbsp;method&nbsp;:&nbsp;methods)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(method.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(method.getName().equals("prt")){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.setAccessible(<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(helloworld,&nbsp;"hello");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>&nbsp; &nbsp; &nbsp;总结:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 调用main方法需要注意，main方法的参数为String[]，但是在method.invoke时，需要将String[]强制转换为Object，至于原因，网上很多说这个，主 &nbsp; &nbsp; &nbsp; 要是说jdk执行main方法时要将String[]分成多个参数等等。后续我分析了源代码后，会将这个问题专门写个文章出来。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 调用private方法需要注意，在调用此方法之前，需要将此执行的方法设置以下，而不是随便找个地方运行下method.setAccessible(true)就完事了。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 使用反射动态调用方法时，主要是用method.invoke()方法，如果是静态方法，则invoke的第一个参数设置null，如果不是静态方法，则将第一个参数设 &nbsp; &nbsp; &nbsp;置为该类生成的对象即可。<img src ="http://www.blogjava.net/morgan/aggbug/387590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morgan/" target="_blank">morgan</a> 2012-09-12 20:55 <a href="http://www.blogjava.net/morgan/articles/reflection.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>