java中如何调用其他java文件?
你所说的java文件是什么文件?如果是java源码文件是不能调用的,但如果是编译后的class文件可以通过类加载器进行加载,然后通过反射调用;但一般会通过实现特定的接口来简化调用过程。一个自定义的类加载器如下:
class MyClassLoader extends ClassLoader {
//类加载器的名称
private String name;
//类存放的路径
private String path = “E:\\bin”;
MyClassLoader(String name) {
this.name = name;
}
MyClassLoader(ClassLoader parent, String name) {
super(parent);
this.name = name;
}
/**
* 重写findClass方法,加载特定目录下的类文件
*/
@Override
public Class? findClass(String name) {
byte[] data = loadClassData(name);
return this.defineClass(name, data, 0, data.length);
}
public byte[] loadClassData(String name) {
try {
name = name.replace(“.”, “//”);
FileInputStream is = new FileInputStream(new File(path, name + “.class”));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = 0;
while ((b = is.read()) != -1) {
baos.write(b);
}
return baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
java 调用so文件
用JNI实现
实例:
创建HelloWorld.java
class HelloWorld
{
private native void print();
public staticvoid main(String[] args)
{
new HelloWorld().print();
}
static
{
System.loadLibrary(“HelloWorld”);
}
}
注意print方法的声明,关键字native表明该方法是一个原生代码实现的。另外注意static代码段的System.loadLibrary调用,这段代码表示在程序加载的时候,自动加载libHelloWorld.so库。
编译HelloWorld.java
在命令行中运行如下命令:
javac HelloWorld.java
在当前文件夹编译生成HelloWorld.class。
生成HelloWorld.h
在命令行中运行如下命令:
javah -jni HelloWorld
在当前文件夹中会生成HelloWorld.h。打开HelloWorld.h将会发现如下代码:
/* DO NOT EDIT THIS FILE – it is machine generated */
#include jni.h
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern “C” {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
该文件中包含了一个函数Java_HelloWorld_print的声明。这里面包含两个参数,非常重要,后面讲实现的时候会讲到。
实现HelloWorld.c
创建HelloWorld.c文件输入如下的代码:
#include jni.h
#include stdio.h
#include “HelloWorld.h”
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf(“Hello World!\n”);
}
注意必须要包含jni.h头文件,该文件中定义了JNI用到的各种类型,宏定义等。
另外需要注意Java_HelloWorld_print的两个参数,本例比较简单,不需要用到这两个参数。但是这两个参数在JNI中非常重要。
env代表java虚拟机环境,Java传过来的参数和c有很大的不同,需要调用JVM提供的接口来转换成C类型的,就是通过调用env方法来完成转换的。
obj代表调用的对象,相当于c++的this。当c函数需要改变调用对象成员变量时,可以通过操作这个对象来完成。
编译生成libHelloWorld.so
在Linux下执行如下命令来完成编译工作:
cc -I/usr/lib/jvm/java-6-sun/include/linux/
-I/usr/lib/jvm/java-6-sun/include/
-fPIC -shared -o libHelloWorld.so HelloWorld.c
在当前目录生成libHelloWorld.so。注意一定需要包含Java的include目录(请根据自己系统环境设定),因为Helloworld.c中包含了jni.h。
另外一个值得注意的是在HelloWorld.java中我们LoadLibrary方法加载的是
“HelloWorld”,可我们生成的Library却是libHelloWorld。这是Linux的链接规定的,一个库的必须要是:lib+库
名+.so。链接的时候只需要提供库名就可以了。
运行Java程序HelloWorld
大功告成最后一步,验证前面的成果的时刻到了:
java HelloWorld
如果你这步发生问题,如果这步你收到java.lang.UnsatisfiedLinkError异常,可以通过如下方式指明共享库的路径:
java -Djava.library.path=’.’ HelloWorld
当然还有其他的方式可以指明路径请参考《在Linux平台下使用JNI》。
我们可以看到久违的“Hello world!”输出了。
Java怎么调用pyd文件
在做项目的时候,有的时候由于合作人员之间所会的编程语言的不同,会导致项目合作中的一些问题,很多时候需要不同语言之间的调用,这次就分享一下java调用python代码的东西。
一、python代码运行
巧妇难为无米之炊。首先,要确保python环境配置完好,并且相应的python代码可以运行。这个就不在这里进行讲述了,如果有需要可以查看我之前的一些文章。
二、java调用python代码
1、查阅了一些网上资料,看到了很多介绍使用jython调用python代码的例子,不过由于一些原因我没有尝试这个方法,而是直接测试了Runtime.getRuntime().exec(args)这个java库中自带的方法,下面直接切入主题。
2、先直接上代码:
python代码(helloword.py):
# coding:utf-8import numpy as np
if __name__ == ‘__main__’:
a = np.ones(3)
print(a) print ‘恭喜您!java调用python代码成功’
java代码(MyDemo.java):
import java.io.BufferedReader;import java.io.InputStreamReader;public class MyDemo { public static void main(String[] args) { try {
System.out.println(“start”);
String[] args1=new String[]{“/home/huan/anaconda2/bin/python”,”/home/huan/myfile/pythonfile/helloword.py”};
Process pr=Runtime.getRuntime().exec(args1);
BufferedReader in = new BufferedReader(new InputStreamReader(
pr.getInputStream()));
String line; while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
pr.waitFor();
System.out.println(“end”);
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:
需要注意的是此行代码:
String[] args1=new String[]{“/home/huan/anaconda2/bin/python”,”/home/huan/myfile/pythonfile/helloword.py”};
这句代码是很重要的,首先一定要设置好你所使用的python的位置,切记不要直接使用python,因为系统会默认使用自带的python,所以一定要设置好你所使用的python的位置,否则可能会出现意想不到的问题(比如说我使用的是anaconda中的python,而ubuntu系统会默认调用自带的python,而我自带的python中并没有numpy库,所以会造成相应的代码不会执行的问题,所以设置好python的位置是很重要的)。还有就是要设置好py文件的位置,使用绝对路径。
还有就是可以看出,此方法可以满足我们python代码中调用第三方库的情况,简单实用。
三、java中向python代码动态传参
python代码(helloword.py):
# coding:utf-8import numpy as npimport sys
if __name__ == ‘__main__’:
a = np.ones(3)
print(a) print ‘恭喜您!java调用python代码成功’
print ‘脚本名为:%s’%(sys.argv[0]) print ‘传入的参数为:’
for i in range(1, len(sys.argv)):print ‘参数:%s’%(sys.argv[i])
java代码(MyDemo.java):
import java.io.BufferedReader;import java.io.InputStreamReader;public class MyDemo { public static void main(String[] args) { try {
System.out.println(“start”);
String para1=”time”;
String para2=”sfdjk”;
String[] args1 = new String[]{“/home/huan/anaconda2/bin/python”, “/home/huan/myfile/pythonfile/helloword.py”,para1,para2};
Process pr = Runtime.getRuntime().exec(args1);
BufferedReader in = new BufferedReader(new InputStreamReader(
pr.getInputStream()));
String line; while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
pr.waitFor();
System.out.println(“end”);
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码运行结果为:
好了,多余的话就不说了,一切尽在代码中。此处的分享就到这里了。
java 怎么在程序里取 excel里悬浮框的值,随便什么方式 poi ,jxl都可以。
java 怎么在程序里取 excel里悬浮框的值,随便什么方式 poi ,jxl都可以
用的是poi
package com;
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class CreateXL {
/**
* 制定EXCEL要存放的文件位置,假定在D盘的test目录下
*/
public static String outputFile=”C:/Users/chentx/Desktop/test.xls”;
public static void main(String[] args) {
try {
//创建新的Excel工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
//在Excel中建一个工作表,其名为默认值
//如果建造一张为”ucap字段”的工作表,那么语句就是HSSFSheet sheet =workbook.createSheet(“ucap字段”);
HSSFSheet sheet =workbook.createSheet();
//在索引0的位置创建行(最顶端的行)
HSSFRow row = sheet.createRow(0);
//在索引0的位置创建单元格(左上端)
HSSFCell cell = row.createCell(0);
//定义单元格为字符串类型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
//在单元格中输入一些内容
cell.setCellValue(“field1”);
//begin,设置单元格格式———————————–
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);//设置红色
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//设置粗体
//创建格式
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);
//应用格式
cell.setCellStyle(cellStyle); //设置格式
cell.setCellType(HSSFCell.CELL_TYPE_STRING);//定义单元格为字符串类型
cell.setCellValue(“陈天翔霸气”);//设置文本内容
//end,————————————————
//输出文件流
FileOutputStream fOut = new FileOutputStream(outputFile);
//把相应的excel工作表保存到硬盘上
workbook.write(fOut);
fOut.flush();
fOut.close();//关闭文件,操作结束
System.out.println(“文件生成完毕….”);
} catch (Exception e) {
System.out.println(“已运行出错” + e);
}
}
}
/*******************************************************************************************************/
package com;
import java.io.FileInputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class ReadXL {
public static String fileToBeRead=”C:/Users/chentx/Desktop/test.xls”;
public static void main(String[] args) {
try {
//创建对excel工作表文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
/* 创建对工作表的引用,本例按名引用(工作簿名Sheet0)
* HSSFSheet sheet = workbook.getSheet(“Sheet0”);
* 或者按索引引用
* HssfSheet sheet = workbook.getSheetAt(0);
*/
HSSFSheet sheet = workbook.getSheetAt(0);
//读取左上端单元
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell(0);
//拿到读出的内容
String mes = cell.getStringCellValue();
System.out.println(“拿到的信息:” + mes);
} catch (Exception e) {
e.printStackTrace();
}
}
}
java application运行出现框框
jfreechart新版的会出这问题的。。。。你换个低版本的可以试试。。
我以前出过这问题。。 换个jar就可以了。。
java如何调用exe文件?
public class transferExe {\x0d\x0a public static void main(String[] args) {\x0d\x0a openWinExe();\x0d\x0a openExe();\x0d\x0a }\x0d\x0a //用 Java 调用windows系统的exe文件,比如notepad,calc之类\x0d\x0a public static void openWinExe() {\x0d\x0a Runtime rn = Runtime.getRuntime();\x0d\x0a Process p = null;\x0d\x0a try {\x0d\x0a String command = “notepad”;\x0d\x0a p = rn.exec(command);\x0d\x0a } catch (Exception e) {\x0d\x0a System.out.println(“Error win exec!”);\x0d\x0a }\x0d\x0a }\x0d\x0a //调用其他的可执行文件,例如:自己制作的exe,或是 下载 安装的软件.\x0d\x0a public static void openExe() {\x0d\x0a Runtime rn = Runtime.getRuntime();\x0d\x0a Process p = null;\x0d\x0a try {\x0d\x0a p = rn.exec(“\”D:/QQ2010.exe\””);\x0d\x0a } catch (Exception e) {\x0d\x0a System.out.println(“Error exec!”);\x0d\x0a }\x0d\x0a }\x0d\x0a }