通過反射調用一個類的方法(兩種)


方法一:

首先我們建立一個Person類:

package person;

import sex.Sex;

public class Person{
	private String name = null;
	private int age = 0;
	private Sex sex = null;
	private String birthday = null;
	
	public Person(){};
	public Person(String name, int age, Sex sex, String birthday){
		String birMatch = "\\d{4}-\\d{2}-\\d{2}";
		this.name = name;
		this.age = age;
		this.sex = sex;
		if(birthday.matches(birMatch)){
			this.birthday = birthday;
		}
	}
	public void setInfo(String name, int age, Sex sex, String birthday){
		String birMatch = "\\d{4}-\\d{2}-\\d{2}";
		this.name = name;
		this.age = age;
		this.sex = sex;
		if(birthday.matches(birMatch)){
			this.birthday = birthday;
		}
	}
	public String getPerName(){
		return this.name;
	}
	public int getAge(){
		return this.age;
	}
	public Sex getSex(){
		return this.sex;
	}
	public String getBirthday(){
		return this.birthday;
	}
	public String toString(){
		return this.name + ", " + this.age + " years old, " + this.sex + ", " + this.birthday;
	}
}

  再建立一個枚舉Sex:

package sex;

public enum Sex{
	MALE, FEMALE;
}

  然后在Main.java中調用Person類的setInfo方法:

package main;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import person.Person;
import sex.Sex;

public class Main {
	public static void main(String[] args){
		try {
			Class<?> cls = Class.forName("person.Person");
			Object obj = cls.newInstance();
			//第一個參數是被調用方法的名稱,后面接着這個方法的形參類型
			Method setFunc = cls.getMethod("setInfo", String.class, int.class, Sex.class, String.class);
			Method toStringFunc = cls.getMethod("toString");
			//取得方法后即可通過invoke方法調用,傳入被調用方法所在類的對象和實參,對象可以通過cls.newInstance取得
			setFunc.invoke(obj, "XiaoBiqiang", 21, Sex.MALE, "1995-11-01");
			System.out.println(toStringFunc.invoke(obj));			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  運行結果:

XiaoBiqiang, 21 years old, MALE, 1995-11-01

方法二:

修改Person類,Sex枚舉不變:

package person;

import sex.Sex;

public class Person{
	private String name = null;
	private int age = 0;
	private Sex sex = null;
	private String birthday = null;
	
	public Person(){};
	public Person(String name, int age, Sex sex, String birthday){
		String birMatch = "\\d{4}-\\d{2}-\\d{2}";
		this.name = name;
		this.age = age;
		this.sex = sex;
		if(birthday.matches(birMatch)){
			this.birthday = birthday;
		}
	}
	public void setInfo(String name, int age, Sex sex, String birthday){
		String birMatch = "\\d{4}-\\d{2}-\\d{2}";
		this.name = name;
		this.age = age;
		this.sex = sex;
		if(birthday.matches(birMatch)){
			this.birthday = birthday;
		}
	}
	public void setName(String name){
		this.name = name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public void setSex(Sex sex){
		this.sex = sex;
	}
	public void setBirthday(String birthday){
		this.birthday = birthday;
	}
	public String getName(){
		return this.name;
	}
	public int getAge(){
		return this.age;
	}
	public Sex getSex(){
		return this.sex;
	}
	public String getBirthday(){
		return this.birthday;
	}
	public String toString(){
		return this.name + ", " + this.age + " years old, " + this.sex + ", " + this.birthday;
	}
}

  修改Main.java:

package main;

import java.lang.reflect.Method;
import person.Person;
import sex.Sex;

public class Main {
	public static void main(String[] args){
		try {
			Class<?> cls = Class.forName("person.Person");
			Object obj = cls.newInstance();
			setter(obj, "name", "XiaoBiqiang", String.class);
			setter(obj, "age", 21, int.class);
			setter(obj, "sex", Sex.MALE, Sex.class);
			setter(obj, "birthday", "1995-11-01", String.class);
			System.out.println((String)getter(obj, "name"));
			System.out.println((int)getter(obj, "age"));
			System.out.println((Sex)getter(obj, "sex"));
			System.out.println((String)getter(obj, "birthday"));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void setter(Object obj, String toSet, Object value, Class<?> paraTypes){
		Method target = null;
		try {
			target = obj.getClass().getMethod("set"+upperFirst(toSet), paraTypes);
			target.invoke(obj, value);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static Object getter(Object obj, String toGet){
		Method target = null;
		Object result = null;
		try {
			target = obj.getClass().getMethod("get"+upperFirst(toGet));
			result = target.invoke(obj);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
	public static String upperFirst(String toUpper){
		return toUpper.substring(0, 1).toUpperCase()+ toUpper.substring(1);
	}
}

  運行結果:

XiaoBiqiang
21
MALE
1995-11-01 

主方法通過setter和getter方法分別設置和調用類中的屬性。

建議:在類中屬性要封裝,通過setter和getter方法設置和獲取屬性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM