Java反射机制之Method invoke执行调用方法例子

①创建两个类,一个父类,一个子类
package com.mrlove.test;

public class BaseObject {
	public void getObjectName(){
		System.out.println("BaseObject");
	}
}
package com.mrlove.test;

public class SubObject extends BaseObject{
	@Override
	public void getObjectName() {
		System.out.println("SubObject");
	}
	public void getParamsLength(String...params){
		System.out.println("param's length is:"+params.length);
	}
	public void getParamsLength(String param1,String param2){
		System.out.println(param1 + "-" + param2);
	}
}
②测试类,主要测试重载方法的调用、可变参数方法的调用、定参方法的调用
package com.mrlove.test;

import java.lang.reflect.Method;

public class ReflectTest {
	
	private static final String BASE_OBJECT_PATH = "com.mrlove.test.BaseObject";
	private static final String SUB_OBJECT_PATH = "com.mrlove.test.SubObject";
	
	public static void main(String[] args) throws Exception{
		
		Class<?> bClazz = Class.forName(BASE_OBJECT_PATH);
		Class<?> sClazz = Class.forName(SUB_OBJECT_PATH);
		
		Object bObj = bClazz.newInstance();//父类实例
		Object sObj = sClazz.newInstance();//子类实例
		
		//1.反射调用子类父类的重载方法
		//多态+动态绑定
		Method bMethod = bClazz.getDeclaredMethod("getObjectName");
		bMethod.invoke(bObj);//父类的bMethod调用父类的getObjectName()
		bMethod.invoke(sObj);//父类的bMethod调用子类的getObjectName();
		
		Method sMethod = sClazz.getDeclaredMethod("getObjectName");
		//不符合多态和动态绑定
		//sMethod.invoke(bObj);//sMethod调用父类的getObjectName(),会报错:java.lang.IllegalArgumentException: object is not an instance of declaring class
		sMethod.invoke(sObj);
		
		//2.反射调用可变参数的方法
		Method changeMethod = sClazz.getDeclaredMethod("getParamsLength", String[].class);
		//可变参数必须这样封装,因为java反射内部实现做了参数个数为1的判断,如果参数长度不为1,则会抛出异常
		String[] strParams = {"a","b","c"};
		Object[] cParams = {strParams};
		changeMethod.invoke(sObj, cParams);
		
		//3.反射调用固定长度参数的方法
		Method unChangeMethod1 = sClazz.getDeclaredMethod("getParamsLength", String.class,String.class);
		unChangeMethod1.invoke(sObj, "Hello","Java");
		//也可以写成这样
		Class<?>[] clazzs = {String.class,String.class};
		Method unChangeMethod2 = sClazz.getDeclaredMethod("getParamsLength", clazzs);
		unChangeMethod2.invoke(sObj, "Hello","Java");
		//下面的这种调用形式也是可以的,不过会报警告
		//String[] params1 = {"Hello","Java"};
		//unChangeMethod1.invoke(sObj, params1);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值