`
goalietang
  • 浏览: 25273 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

浅谈Java的反射(二) 普通方法和main方法的反射调用

阅读更多
      我们来接着实验以下反射调用普通的方法是怎样一种机制
      下面是我在User类中增加的许多方法
 //普通的无参无返回值public方法
	public void execute1(){
		System.out.println("execute1()");
	}
	
  //普通的有参数,有返回值的public方法
	public boolean execute2(boolean isok){
		return isok;
	}
	
  //普通的有三个参数,返回值是int数组的方法
	public int[] execute4(int one, int two, int three){
		return new int[]{one,two,three};
	}
	
  //静态有参数无返回值方法
	public static void execute5(List list){
		System.out.println(list.size());
	}
	
  //私有方法
	private String [] execute5(String one, String two){
		return new String[]{one,two,"gege"};
	}
  //main方法
	public static void main(String[] args){
		System.out.println("main method invoke successfully!!");
	}

      以上方法都很简单,而下面是我想对这些方法分别的调用反射获取并执行的代码
     (代码中有详细注释可供不太了解反射的童鞋学习,我在每个方法的第一行注释里表明了该方法对应的是调用执行哪个方法)
	//public void execute1()
	@Test
	public void test1() throws Exception{
    //调用forName方法获取对应字节码
		Class clazz = Class.forName("com.ncs.tang.User");
    //直接通过该字节码获取对应的对象,以供之后使用该对象调用方法
		User user = (User) clazz.newInstance();
    //第一个参数是方法名
    //第二个参数及以后都是该方法有的参数类型,因为是无参的,所以null
    //返回值是一个Method对象
		Method meth = clazz.getMethod("execute1", null);
    //使用获得的Method对象嗲用invoke方法
    //传入调用该方法的对象和调用该方法需要传入的具体参数。
		meth.invoke(user, null);
	}
	
	//public boolean execute2(boolean isok)
	@Test
	public void test2() throws Exception{
		Class clazz = Class.forName("com.ncs.tang.User");
		User user = (User) clazz.newInstance();
    //因为有一个boolean参数,所以传入了一个boolean的参数类型
		Method meth = clazz.getMethod("execute2", boolean.class);
    //使用一个Boolean的变量获得boolean返回值
    //这里千万注意,是封装类型Boolean而不是基本类型boolean
    //因为invoke返回的是一个Object对象。
		Boolean isok= (Boolean) meth.invoke(user, System.currentTimeMillis() == 1);
		System.out.println(isok);
	}
	
	//public int[] execute4(int one, int two, int three)
	@Test
	public void test4() throws Exception{
		Class clazz = Class.forName("com.ncs.tang.User");
		User user = (User) clazz.newInstance();
		Method meth = clazz.getMethod("execute4", int.class, int.class, int.class);
		int[] i = (int[]) meth.invoke(user, 33,44,21);
		System.out.println(i[0] + "   " + i[1] + "   " + i[2]);
	}
	
	//public static void execute5(List list)
	@Test
	public void test5() throws Exception{
		Class clazz = Class.forName("com.ncs.tang.User");
		User user = (User) clazz.newInstance();
		Method meth = clazz.getMethod("execute5", List.class);
		List list = new ArrayList();
		for(int i = 0; i < 100; i++){
			list.add("good at: " + i);
		}
    //因为所要反射的是静态方法,所以这里不需要传入任何对象来调用,所以调用者为null
    //但是你也可以传入一个对象来调用方法,不会报错。
		meth.invoke(null, list);
	}
	
	//private String [] execute5(String one, String two)
	@Test
	public void test6() throws Exception{
		Class clazz = Class.forName("com.ncs.tang.User");
		User user = (User) clazz.newInstance();
    //获取私有方法用到的方法是getDeclaredMethod
		Method meth = clazz.getDeclaredMethod("execute5", String.class, String.class);
    //开启该私有方法调用许可
		meth.setAccessible(true);
		String [] s = (String[]) meth.invoke(user, "tangyu", "yuqiang");
		System.out.println(s[0] + "  Kick  " + s[1]);
	}

	//public static void main(String[] args)
	@Test
	public void test8() throws Exception{
		Class clazz = Class.forName("com.ncs.tang.User");
		User user = (User) clazz.newInstance();
		Method meth = clazz.getMethod("main", String[].class);
      //这里,为了兼容1.4版本JDK,main方法反射调用需要在对象数组里面再封装一个String[]的数组来匹配main方法的String[] args 参数。
		meth.invoke(user, new Object[]{new String[]{"aa","bb"}});
      //还有一种方法来使用main方法反射,就是把String[]数组包装成一个Object对象来传参。为什么只传入一个String[]数组调用main方法会失败呢?因为JDK1.4里面参数传递会默认把你的String[]内所含的对象拆出来作为多个参数进行传递,我们这两种方法都是避免虚拟机硬拆我们的String[]数组。让他保持原样传入main方法的参数中。
      meth.invoke(user, (Object)new String[]{"aa","bb"});
	}

      以上就是反射各类对方法调用的基本操作。
分享到:
评论

相关推荐

    java中main方法发送httpPost请求

    java语言后台请求网站操作 java中main方法发送httpPost请求

    java反射知识点

    对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 我的代码里主要有一下知识点...

    Java程序设计基础:调用方法-方法的嵌套调用.pptx

    假设main方法中调用a方法,a 方法中调用b方法,具体流程如下: main 方法 调用a方法 结束 a 方法 调用b方法 b 方法 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ 【示例】阅读程序,写出下列程序的运行结果。 嵌套调用示例 main方法...

    windows下bat文件调用java的main方法

    最近项目需要,自己根据网上找的代码,自己改了一下,主要是把jar包的加载改成了循环加载,而不是一句句写。亲测可用。

    Linux上执行带main方法的java文件

    linux下执行java项目 main方法 打成的jar包,java -jar TestDemo.jar。具体过程请查看文档。

    浅谈java 执行jar包中的main方法

    下面小编就为大家带来一篇浅谈java 执行jar包中的main方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java继承和方法调用

    这是在java中方法的设置和调用,可以在main的函数中直接调用,简化数据量。

    Java实验1代码.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    10个Java经典的Main方法面试题!

    main 方法是 Java 程序的入口方法,JVM 在运行的时候会首先查找 main 方法。 2.不用 main 方法如何运行一个类? 不行,没有 main 方法我们不能运行 Java 类。 在 Java 7 之前,你可以通过使用静态初始化运行 Java 类...

    10个Java经典的Main方法面试题!.pdf

    10个Java经典的Main方法面试题!

    java调用动态库实例

    包括java调用动态库的实例与总结,其中有jna调用动态库和jnative调用动态库,分为直接java文件main方法调用和web项目中的servlet调用两种方法

    bat 运行java main方法

    源代码,jar包及bat文件,注意:bat文件中不能有空格。

    批处理执行java项目main方法

    此批处理程序用于执行java项目中某一类的main方法,修改jdk地址,项目地址即可

    java反射.ppt

    每当一個类被载入时,JVM就自动为其生成一个Class对象,通过操作class对象,我们可以得到该对象的所有成员并操作它们 public class ClassDemo { public static void main(String[] args) { String name = “ACCP"; ...

    Java main()方法

    Java中main()方法详解,对初学者来说是个不错的切入点.

    java调用shell脚本

    在java代码中调用shell脚本并传入参数,此java文件是单个测试案例,使用main方法执行java文件

    main方法启动服务

    main方法启动服务-main方法启动服务-main方法启动服务

    java反射小程序

    import java.awt.*; public class Reflect { /*main()类 */ boolean packFrame = false; //Construct the application public Reflect() { Frame1 frame = new Frame1(); //Validate frames that have ...

    Java零基础 - main方法.md

    本文详细介绍了Java零基础的main方法程序的源码和运行过程。通过学习本文,您将了解以下内容: main方法的基本结构和语法; 如何编写和运行最简单的Java程序; 如何使用System.out.println方法输出文本信息。 学习...

    大华摄像机实时监控调用java

    展示Java桌面程序,不支持浏览器调用;供参阅。运行General_NetSDKDemo_Chn_Java_Win64_IS_V1.00.31153.T.171212\JNADemo\src\com\netsdk\demo\example\Preview.java(改过ip端口用户名密码后运行main方法)

Global site tag (gtag.js) - Google Analytics