`

java 反射调用类的方法

 
阅读更多

最近遇到一个问题,重复的写一些方法,这些方法基本除了调用对象的方法不同外其他的都相同,发现这个相同点后,就在考虑怎么写一个方法,只需要传入对象方法的名字就可以对方法进行调用。

这里会用到java反射:

首先建立一个使用反射调用的类Computer:

package com;

public class Computer {
	
	
	public Computer(){
		super();
	}
	
	public void surfInternet(){
		System.out.println("网上冲浪");
	}
	
	public void watchTV(){
		System.out.println("网上看电视");
	}
	
	public void workOffice(){
		System.out.println("网上办公");
	}
	
	public int getLength(String str){
		System.out.print("字符长度为: ");
		return str.length();
	}
	
	public static String getName(String name){
		return name;
	}
	
}

 下面我写一个反射调用的主函数:

package com;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestReflect1 {
	
	public static Object invokeMethod(Method method,Object obj,Object...args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		return method.invoke(obj, args);
	}
	
	public static void main(String[] args) {
		try {
			
			
			int len = (Integer)invokeMethod(Computer.class.getMethod("getLength", String.class),Computer.class.newInstance(),"HP");
			System.out.println(len);
			
			String str = (String)invokeMethod(Computer.class.getMethod("getName", String.class),null,"HP");
			System.out.println(str);
			
			String [] strs = new String[]{
				"watchTV","surfInternet","workOffice"
			};
			for(int i=0;i<strs.length;i++)
				invokeMethod(Computer.class.getMethod(strs[i], null), Computer.class.newInstance(), null);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}
}

 比较下面的代码:

int len = (Integer)invokeMethod(Computer.class.getMethod("getLength", String.class),Computer.class.newInstance(),"HP");
			System.out.println(len);
			
			String str = (String)invokeMethod(Computer.class.getMethod("getName", String.class),null,"HP");
			System.out.println(str);

 发现一个传入了对象一个没有传入对象,原因是在于一个为成员方法,一个为静态方法,静态方法可以说是在类加载的时候就已经创建了,而成员方法必须是对象创建是才被创建,所以成员方法必须加入对象。

再看下面的调用:

			String [] strs = new String[]{
				"watchTV","surfInternet","workOffice"
			};
			for(int i=0;i<strs.length;i++)
				invokeMethod(Computer.class.getMethod(strs[i], null), Computer.class.newInstance(), null);
		

 Computer中含有3个类似的方法,而且参数基本相同,所以我就使用一个数组的方式来对这个对象进行调用,而不是直接通过对象调用方法。

 

这样做就可以在进行相似处理时传入对象的方法来进行调用。

 

但是使用反射后运行效率会下降,但是代码的重用性却提高了不少。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics