反射 之 调用类中有参数和无参数的方法

package com.cn.service;

/**
 * 接口对象
 * @author Administrator
 *
 */
public interface China {

	public static final String NATIONAL="China";//常量
	
	public static final String AUTHOR="老李";//接口中的常量
	
	public void sayChina();//方法,实现接口必须重写
	
	public String sayHello(String name,int age);//方法,实现接口必须重写
}


package com.cn.model;

import com.cn.service.China;

public class Person implements China{

	private String name;
	
	private int age;
	
	public Person(){
		
	}
	
	public Person(String name){
		this.name=name;
	}
	
	public Person(String name,int age){
		this(name);//调用有一个参数的构造函数
		this.setAge(age);
	}
	
	public void sayChina() {
		// TODO Auto-generated method stub
		System.out.println("作者:"+AUTHOR+" ,国籍: "+NATIONAL);
	}

	public String sayHello(String name, int age) {
		// TODO Auto-generated method stub
		return name+",你好!我今年"+age+"岁了";
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	

}


package com.cn.component;

import java.lang.reflect.Method;
/**
 * 反射之调用类中有参数和无参数的方法
 * @author Administrator
 *
 */
public class InvokeSayChina {

	public static void main(String args[]) {
		Class<?> c = null;
		try {
			c = Class.forName("com.cn.model.Person");//申明class对象
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		try {
			//调用无参数方法
//			Method method = c.getMethod("sayChina");//通过class对象取得方法名称,该方法没参数
//			method.invoke(c.newInstance());//调用方法,必须传递对象实例
		    //输出结果:作者:老李 ,国籍: China
			
			//调用有参数的方法 ,obj...args表示可变参数
			Method method=c.getMethod("sayHello", String.class,int.class);//第一个参数为方法名称,后面参数为可变参数
			String returnValue="";//初始化返回值
			//method.invoke返回一个Object,因此必须向下转型
			returnValue=(String)method.invoke(c.newInstance(), "小李子",28);//第一个参数表示类的实例化对象,第二个及其以后参数为可变参数
			System.out.println(returnValue);
			
		} 
		catch(Exception e){
			e.printStackTrace();
		}
		//输出结果:
		//小李子,你好!我今年28岁了
		
	}

}

 

你可能感兴趣的:(C++,c,C#)