JAVA反射机制调用类或JAR包

一、基本概念
1、JAVA反射机制:指在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
二、开发环境
Windows+Eclipse(Eclipse Java EE IDE for Web DevelopersVersion: Neon.2 Release (4.6.2))+JDK1.8
三、项目创建
1、新建一个Java Project项目(自行百度)。

2、创建要调取的类AnalyticPulsator.java(放src文件夹下的com.edu.ouc.library包下)

package com.edu.ouc.library;
/** 
* @author 作者 : jhc
* @version 创建时间:2019年1月25日 上午10:04:12 
* 类说明 
*/
public class AnalyticPulsator {
	public static String GetData(String param1,String param2){
		return param1+"@@@@@@@"+param2;
	}
}

3、调取设备类主函数MainControl.java(放src文件夹下的com.edu.ouc.main包下)(执行流程是:首先判断是否有AnalyticPulsator类,若没有,则调取jar包,最后将调取的类利用java反射机制调取其方法,并传递参数)

package com.edu.ouc.main;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * @author 作者 : jhc
 * @version 创建时间:2019年1月25日 上午9:53:59 类说明
 */
public class MainControl {

	public static void main(String[] args) throws UnsupportedEncodingException {
		//设备解析类是否存在
		boolean ifLibrary =false;
		Class analyticClass=null;
		try {
			analyticClass=Class.forName("com.edu.ouc.library."+"AnalyticPulsator");
			ifLibrary=true;
		} catch (ClassNotFoundException e) {
		}catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			URLClassLoader urlClassLoader =null;
			if(!ifLibrary){
				
				//获取数据采集程序所在目录
				URL urlPath=MainControl.class.getProtectionDomain().getCodeSource().getLocation();
				System.out.println(urlPath.getPath());
				//包路径定义
				URL url = new URL("file:"+urlPath.getPath()+"/AnalyticPulsator.jar");
				//设置类加载器
				urlClassLoader = new URLClassLoader(new URL[] { url });
				//加载设备数据解析类
				analyticClass = urlClassLoader.loadClass("com.edu.ouc.library.AnalyticPulsator");
			}else{
				//加载设备数据解析类
				analyticClass = Class.forName("com.edu.ouc.library."+"AnalyticRoller");
			}
	
		// 设置需要传递的参数
		Object[] parameters = new Object[2];
		parameters[0] = "1212";
		parameters[1] = "----"; 
		// 设置需要传递的参数类型
		Class[] parameterTypes = new Class[2];
		parameterTypes[0] = String.class;
		parameterTypes[1] = String.class;
		//获取数据解析GetData方法
		Method method = analyticClass.getMethod("GetData", parameterTypes);
		String data;
		try {
			//传递参数并执行方法
			data = method.invoke(analyticClass.newInstance(), parameters).toString();
			System.out.println(data);
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
} 

4、运行MainControl.java,结果如下:
JAVA反射机制调用类或JAR包_第1张图片
备注:
Eclipse导出Jar包方式可自行百度。

你可能感兴趣的:(Java)