﻿<?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/stevenjohn/category/51394.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Fri, 03 Apr 2015 10:21:15 GMT</lastBuildDate><pubDate>Fri, 03 Apr 2015 10:21:15 GMT</pubDate><ttl>60</ttl><item><title>java反射和ASM</title><link>http://www.blogjava.net/stevenjohn/archive/2015/04/03/424109.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 03 Apr 2015 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/04/03/424109.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/424109.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/04/03/424109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/424109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/424109.html</trackback:ping><description><![CDATA[<div>反射只能读取类信息，而 ASM 除了读还能写。</div><div></div><div>反射读取类信息时需要进行类加载处理，而 ASM 则不需要将类加载到内存中。</div><div></div><div>反射相对于 ASM 来说使用方便，想直接操纵 ASM 的话需要有 JVM 指令基础。 &nbsp;</div><div>反射是读取持久堆上存储的类信息。而 ASM 是直接处理 .class 字节码的小工具（工具虽小，但是功能非常强大！）&nbsp;</div><img src ="http://www.blogjava.net/stevenjohn/aggbug/424109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-04-03 18:20 <a href="http://www.blogjava.net/stevenjohn/archive/2015/04/03/424109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 反射调用方法</title><link>http://www.blogjava.net/stevenjohn/archive/2012/10/22/390070.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 22 Oct 2012 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/10/22/390070.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/390070.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/10/22/390070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/390070.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/390070.html</trackback:ping><description><![CDATA[<p>package lc.abin.lee.reflect;</p>
<p>import java.lang.reflect.Constructor;<br />import java.lang.reflect.Method;</p>
<p>public class MyMethod {<br />&nbsp;private static String name;<br />&nbsp;public MyMethod() {<br />&nbsp;}<br />&nbsp;public MyMethod(String myname) {<br />&nbsp;&nbsp;this.name=myname;<br />&nbsp;}<br />&nbsp;public static String getName(){<br />&nbsp;&nbsp;return name;<br />&nbsp;}<br />&nbsp;public static String getMessage(){<br />&nbsp;&nbsp;return "北京欢迎您";<br />&nbsp;}<br />&nbsp;public static String result(String message){<br />&nbsp;&nbsp;return message.replace("my", "abin");<br />&nbsp;}<br />&nbsp;public static int status(int enter,int end){<br />&nbsp;&nbsp;return end+enter;<br />&nbsp;}<br />&nbsp;public static void main(String[] args) throws Exception {<br />&nbsp;&nbsp;MyMethod my=new MyMethod();<br />&nbsp;&nbsp;Class&lt;?&gt; cls=my.getClass();<br />&nbsp;&nbsp;Method mes=cls.getDeclaredMethod("getMessage");<br />&nbsp;&nbsp;String message=(String)mes.invoke(my);<br />&nbsp;&nbsp;System.out.println("message="+message);<br />&nbsp;&nbsp;Method mld=cls.getDeclaredMethod("result", String.class);<br />&nbsp;&nbsp;String result=(String)mld.invoke(my,"myarea");<br />&nbsp;&nbsp;System.out.println("result="+result);<br />&nbsp;&nbsp;Method plus=cls.getDeclaredMethod("status",int.class,int.class);<br />&nbsp;&nbsp;int status=(Integer)plus.invoke(my,5,195);<br />&nbsp;&nbsp;System.out.println("status="+status);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Class&lt;?&gt;[] cl={String.class};<br />&nbsp;&nbsp;Constructor&lt;?&gt; cul=cls.getConstructor(cl);<br />&nbsp;&nbsp;Object obj=cul.newInstance("abin1");<br />&nbsp;&nbsp;System.out.println("obj="+obj.getClass());<br />&nbsp;&nbsp;Method nmd=cls.getDeclaredMethod("getName");<br />&nbsp;&nbsp;String gong=(String)nmd.invoke(cl);<br />&nbsp;&nbsp;System.out.println("gong="+gong);<br />&nbsp;&nbsp;<br />&nbsp;}<br />}</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/390070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-10-22 23:52 <a href="http://www.blogjava.net/stevenjohn/archive/2012/10/22/390070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 反射机制(三)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/04/15/374199.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 14 Apr 2012 16:25:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/04/15/374199.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/374199.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/04/15/374199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/374199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/374199.html</trackback:ping><description><![CDATA[<p>在类中寻找指定的方法，同时获取该方法的参数列表，例外和返回值<br /><br />package com.abin.lee.reflect;</p>
<p>import java.lang.reflect.Method;</p>
<p>public class method1 {<br />&nbsp;private int f1(Object p,int x) throws NullPointerException{<br />&nbsp;&nbsp;if(p==null)<br />&nbsp;&nbsp;&nbsp;throw new NullPointerException();<br />&nbsp;&nbsp;return x;<br />&nbsp;}<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Class cls=Class.forName("com.abin.lee.reflect.method1");<br />&nbsp;&nbsp;&nbsp;Method[] method=cls.getDeclaredMethods();<br />&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;method.length;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;Method m=method[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("name="+m.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("decl class="+m.getDeclaringClass());<br />&nbsp;&nbsp;&nbsp;&nbsp;Class pvec[]=m.getParameterTypes();<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;pvec.length;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("param#"+j+" "+pvec[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;Class evec[]=m.getExceptionTypes();<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int k=0;k&lt;evec.length;k++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("evec="+evec[k]);<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("return type="+m.getReturnType());<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;</p>
<p>}<br /><br /><br /><br /><br /><br /><br />获取类的构造函数信息，基本上与获取方法的方式相同<br /><br /></p>
<p>package com.abin.lee.reflect;</p>
<p>import java.lang.reflect.Constructor;</p>
<p>public class constructor1 {<br />&nbsp;public constructor1(){}<br />&nbsp;public constructor1(int i,double d){}<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Class&lt;?&gt; con=constructor1.class;<br />&nbsp;&nbsp;&nbsp;Constructor cs[]=con.getConstructors();<br />&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;cs.length;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;Constructor ct=cs[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("name="+ct.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("decl class="+ct.getDeclaringClass());<br />&nbsp;&nbsp;&nbsp;&nbsp;Class pvec[]=ct.getParameterTypes();<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;pvec.length;j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("param="+pvec[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Class excp[]=ct.getExceptionTypes();<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;excp.length;j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("exception="+excp[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br /></p>
<p><br /><br /><br /><br /><br /><br />获取类中的各个数据成员对象，包括名称。类型和访问修饰符号：<br /></p>
<p>package com.abin.lee.reflect;</p>
<p>import java.lang.reflect.Field;</p>
<p>public class FieldTest {<br />&nbsp;private double d;<br />&nbsp;public static final int i=37;<br />&nbsp;String s="testing";<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;Class&lt;?&gt; cls=FieldTest.class;<br />&nbsp;&nbsp;Field field[]=cls.getDeclaredFields();<br />&nbsp;&nbsp;for(int i=0;i&lt;field.length;i++){<br />&nbsp;&nbsp;&nbsp;Field fd=field[i];<br />&nbsp;&nbsp;&nbsp;System.out.println("name="+fd.getName());<br />&nbsp;&nbsp;&nbsp;System.out.println("class="+fd.getDeclaringClass());<br />&nbsp;&nbsp;&nbsp;System.out.println("type="+fd.getType());<br />&nbsp;&nbsp;&nbsp;int mod=fd.getModifiers();<br />&nbsp;&nbsp;&nbsp;System.out.println("modifiers="+java.lang.reflect.Modifier.toString(mod));<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;}<br />}<br /></p>
<p><br /></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/374199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-04-15 00:25 <a href="http://www.blogjava.net/stevenjohn/archive/2012/04/15/374199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java反射机制(二)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/04/14/374123.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 13 Apr 2012 18:08:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/04/14/374123.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/374123.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/04/14/374123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/374123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/374123.html</trackback:ping><description><![CDATA[<p>package com.abin.lee.reflect;</p>
<p>import java.lang.reflect.Method;</p>
<p>public class InvokeTester {<br />&nbsp;public int add(int param1,int param2){<br />&nbsp;&nbsp;return param1+param2;<br />&nbsp;}<br />&nbsp;public String echo(String message){<br />&nbsp;&nbsp;return "hello"+message;<br />&nbsp;}<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Class&lt;?&gt; classType=InvokeTester.class;<br />&nbsp;&nbsp;&nbsp;Object invokeTester=classType.newInstance();<br />&nbsp;&nbsp;&nbsp;System.out.println(invokeTester instanceof InvokeTester);<br />&nbsp;&nbsp;&nbsp;Method addMethod=classType.getMethod("add", new Class[]{int.class,int.class});<br />&nbsp;&nbsp;&nbsp;Object result=addMethod.invoke(invokeTester, new Object[]{1,2});<br />&nbsp;&nbsp;&nbsp;System.out.println((Integer)result);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;System.out.println("----------");<br />&nbsp;&nbsp;&nbsp;Method echoMethod=classType.getMethod("echo", new Class[]{String.class});<br />&nbsp;&nbsp;&nbsp;Object result2=echoMethod.invoke(invokeTester, new Object[]{"abin"});<br />&nbsp;&nbsp;&nbsp;System.out.println(result2);<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br /></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/374123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-04-14 02:08 <a href="http://www.blogjava.net/stevenjohn/archive/2012/04/14/374123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java反射机制(一)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/04/14/374119.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 13 Apr 2012 17:02:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/04/14/374119.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/374119.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/04/14/374119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/374119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/374119.html</trackback:ping><description><![CDATA[<p>package com.abin.lee.reflect;</p>
<p>import java.lang.reflect.Method;</p>
<p>public class DumpMethods {<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Class clazz=Class.forName("java.util.Stack");<br />&nbsp;&nbsp;&nbsp;Method method[]=clazz.getDeclaredMethods();<br />&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;method.length;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(method[i].toString());<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;System.err.println(e.getMessage());<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p>}<br /></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/374119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-04-14 01:02 <a href="http://www.blogjava.net/stevenjohn/archive/2012/04/14/374119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>