java反射调用main方法,private方法实现
2012-09-17 23:37
543 查看
最近研究jetty源代码的时候,发现这个容器里面的代码根本无法看懂,都是java语法,基本上都是反射+设计模式+配置文件。很莫名奇妙的方法调用。里面有调用main方法的反射,结果没看懂,所以就再来研究研究反射功能。由于反射的文章在网上太多了,我主要研究了一下main方法,private方法的调用。如下,反射调用HelloWorld类的方法。HelloWorld类如下:
调用main方法如下:
调用private方法如下:
总结:
1 调用main方法需要注意,main方法的参数为String[],但是在method.invoke时,需要将String[]强制转换为Object,至于原因,网上很多说这个,主要是说jdk执行main方法时要将String[]分成多个参数等等。后续我分析了源代码后,会将这个问题专门写个文章出来。
2 调用private方法需要注意,在调用此方法之前,需要将此执行的方法设置以下,而不是随便找个地方运行下method.setAccessible(true)就完事了。
3 使用反射动态调用方法时,主要是用method.invoke()方法,如果是静态方法,则invoke的第一个参数设置null,如果不是静态方法,则将第一个参数设置为该类生成的对象即可。
public class HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld"); } private void prt(String msg){ System.out.println(msg); } }
调用main方法如下:
public class HelloWorldRefection { public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { Method method = HelloWorld.class.getMethod("main",String[].class); method.invoke(null,(Object)new String[]{}); } }
调用private方法如下:
public class HelloWorldRefection { public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { Class clazz = HelloWorld.class; HelloWorld helloworld = HelloWorld.class.newInstance(); Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println(method.getName()); if(method.getName().equals("prt")){ method.setAccessible(true); method.invoke(helloworld, "hello"); } } } }
总结:
1 调用main方法需要注意,main方法的参数为String[],但是在method.invoke时,需要将String[]强制转换为Object,至于原因,网上很多说这个,主要是说jdk执行main方法时要将String[]分成多个参数等等。后续我分析了源代码后,会将这个问题专门写个文章出来。
2 调用private方法需要注意,在调用此方法之前,需要将此执行的方法设置以下,而不是随便找个地方运行下method.setAccessible(true)就完事了。
3 使用反射动态调用方法时,主要是用method.invoke()方法,如果是静态方法,则invoke的第一个参数设置null,如果不是静态方法,则将第一个参数设置为该类生成的对象即可。
相关文章推荐
- java中由类名和方法名字符串实现其调用【反射机制】
- java中利用反射机制实现调用给定为字符串的方法名
- java中利用反射调用另一类的private方法
- Java 反射,通过反射调用所有的方法,包括private方法
- java反射调用方法时,Class . can not access a member of class . with modifiers "private" 等异常解决
- Java中通过反射调用其他类中的main方法时要注意的问题
- Java中通过反射调用其他类中的main方法时要注意的问题
- Java调用private方法—Java中的类反射机制
- 动态编译_DynamicCompile、反射调用main方法问题JAVA214
- java中利用反射调用另一类的private方法的简单实例
- java通过反射调用类的private方法.
- java反射调用private方法,获取修改private属性值
- java 反射调用 私有构造类中 private static final 属性的方法
- Java通过反射实现方法调用
- 反射调用private方法实践(php、java)
- 黑马程序员java高新技术篇----通过反射调用main方法
- java反射中两种方法的不同(反射能否实现对类的私有方法的调用)
- java中用反射调用其他类的main方法时应注意的问题
- JAVA反射+SOCKET实现远程方法调用
- java中利用反射机制实现调用给定为字符串的方法名