一、基本概念
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,结果如下:
备注:
Eclipse导出Jar包方式可自行百度。