JAVA反射机制的几种实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzxadsl/article/details/47755149
<pre name="code" class="java">package com.user.test;

import java.lang.reflect.Method;

/**
 * java反射练习
 * @author lizhixian
 * @version 1.0
 * @create_date 2015-7-15 下午2:38:34
 */
public class InvokeTest {

	public void testInvoke(String name){
		System.out.println("welcome:"+name);
	}
	public void testInvoke(){
		System.out.println("welcome:haha");
	}
	
	public static void testStatic(String name){
		System.out.println("welcome static:"+name);
	}
	/**
	 * 通过类字符串名调用
	 * @param className 类完整路径
	 */
	public void newClass(String className){
		try {
			Object obj = Class.forName(className).newInstance();
			//Method method = obj.getClass().getMethod("testInvoke",new Class[]{String.class});//只能调用公有方法
			String paramType = "java.lang.String";//参数类型
			Method method = obj.getClass().getDeclaredMethod("testInvoke",new Class[]{Class.forName(paramType).newInstance().getClass()});
			method.invoke(obj,new Object[]{"lzx"});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 通过泛型调用
	 * @param <T> 类  XXX.class
	 * @param methodName 方法名
	 */
	public <T> void newClass(Class<T> cls,String methodName){
		try {
			Method method = cls.getDeclaredMethod(methodName,new Class[]{});
			method.invoke(cls.newInstance(),new Object[]{});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 调用静态方法
	 * @param className 类完整路径
	 * @param methodName 方法名
	 * @param args 该方法对应的参数
	 */
	public Object invokeStaticMethod(String className, String methodName, Object[] args){  
	    Object retObj = null;
		try {
			Class<?> ownerClass = Class.forName(className);  
		    Class<?>[] argsClass = new Class[args.length];  
		    for (int i = 0, j = args.length; i < j; i++) {  
		        argsClass[i] = args[i].getClass();  
		    }  
		   Method method = ownerClass.getDeclaredMethod(methodName,argsClass);
		   retObj = method.invoke(null, args);  
		} catch (Exception e) {
			e.printStackTrace();
		} 
	   return retObj;
	}
	
	/**
	 * 调用除静态静态方法外的其他方法
	 */
	public <T> Object invokeMethod(Class<T> owner, String methodName, Object[] args){  
		Object retObj = null;
		try {
		    Class<?>[] argsClass = new Class[args.length];  
		    for (int i = 0, j = args.length; i < j; i++) {  
		        argsClass[i] = args[i].getClass();  
		    }  
		    Method method = owner.getDeclaredMethod(methodName,argsClass);  
		    retObj = method.invoke(owner, args);  
		} catch (Exception e) {
			e.printStackTrace();
		}
		return retObj;
	}
	
	public static void main(String[] args) {
		InvokeTest test = new InvokeTest();
		test.newClass("com.user.test.InvokeTest");
		test.newClass(InvokeTest.class,"testInvoke");

		test.invokeStaticMethod("com.user.test.InvokeTest","testStatic",new Object[]{"lzx"});
		test.invokeMethod(InvokeTest.class,"testStatic",new Object[]{"lsl"});
	}
}


 
 
 

猜你喜欢

转载自blog.csdn.net/lzxadsl/article/details/47755149
今日推荐