请问如何在JAVA程序中检测本CLASS已经在操作系统中运行?如果已运行就不执行本class? 如题另,大家知不知道为什么这两天我能登陆到WWW.CSDN.NET,但要登陆到论坛必须用代理? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ClassLoader cl = ClassLoader.getSystemClassLoader();Class c = cl.findLoadedClass("name");if (c != null) ... ... 楼上的,JBUILDER告诉我findLoadedClass是proected access in java.lang.ClassLoader 要是程序中访问可以通过 synchronized(类.class)来控制关注一下解决方案 你可以写一个自定义的ClassLoader类,扩展它来控制JVM的加载动作. 可以参考一下,这里只是简单描述。比如上面的findLoadedClass可以扩写为public /* *自定义加载类**/import java.io.*;public class MyClassLoader extends ClassLoader{ //读取一个文件的内容 private byte[] getBytes(String filename) throws IOException{ File file=new File(filename); long len=file.length(); byte[] raw=new byte[(int)len]; FileInputStream fin=new FileInputStream(file); int r=fin.read(raw); if(r!=len) throw new IOException("Can't read all,"+r+"!="+len); fin.close(); return raw; } private boolean compile(String javaFile) throws IOException { System.out.println("CCL:Compiling "+javaFile+"..."); //调用系统的javac命令 Process p=Runtime.getRuntime().exec("javac "+javaFile); try{ //其他线程都等待这个线程完成 p.waitFor(); }catch(InterruptedException ie){ System.out.println(ie); } int ret=p.exitValue(); return ret==0; } public Class loadClass(String name,boolean resovle) throws ClassNotFoundException { Class clas=null; clas=findLoadedClass(name); //这里说明了包的表示 String fileStub=name.replace('.','/'); String javaFilename=fileStub+".java"; String classFilename=fileStub+".class"; File javaFile=new File(javaFilename); File classFile=new File(classFilename); //如果存在class文件就不编译 if(javaFile.exists()&&(!classFile.exists()||javaFile.lastModified()>classFile.lastModified())) { try{ if(!compile(javaFilename)||!classFile.exists()) { throw new ClassNotFoundException("ClassNotFoundExcetpion:"+javaFilename); } }catch(IOException ie) { throw new ClassNotFoundException(ie.toString()); } } try{ byte[] raw=getBytes(classFilename); //通过读入数据来构造一个类结构,这是核心 clas=defineClass(name,raw,0,raw.length); }catch(IOException ie){ } if(clas==null) { clas=findSystemClass(name); } System.out.println("findSystemClass:"+clas); if(resovle && clas!=null) { resolveClass(clas); } if(clas==null) { throw new ClassNotFoundException(name); } return clas; }}/*** 测试自定义加载类MyClassLoader**/import java.lang.reflect.*;public class MyRun{ public static void main(String[] args) throws Exception { String progClass=args[0]; String progArgs[]=new String[args.length-1]; System.arraycopy(args,1,progArgs,0,progArgs.length); MyClassLoader ccl=new MyClassLoader(); Class clas=ccl.loadClass(progClass); //返回一个class的type Class[] mainArgType={(new String[0]).getClass()}; Method main=clas.getMethod("main",mainArgType); Object argsArray[]={progArgs}; main.invoke(null,argsArray); }}/*** 测试类.*/public class Test{ public static void main(String[] args) { if(args.length!=1) { System.err.println("Error,exit!"); System.exit(1); } String name=args[0]; System.out.println("Hello,"+name); }}运行如下:F:\>java MyRun Test YzlfindSystemClass:class java.lang.ObjectfindSystemClass:class TestfindSystemClass:class java.lang.StringfindSystemClass:class java.lang.SystemfindSystemClass:class java.lang.StringBufferfindSystemClass:class java.io.PrintStreamHello,YzlF:\> 楼上的如果我的操作系统中运行了多个JAVA虚拟机怎么办? 楼上上的操作系统里不是可以运行多个java.exe进程的吗 同关注~ 我想知道java能不能直接监控进程运行状态的,就象windows进程管理器一样~ 关于 java StdDraw library 给大家推荐一个非常专业的研发论坛 - 52RD研发论坛 请教如何在一个函数中返回三个字符串? 关于 getResource 的小问题 如何更新我的java虚拟机 帮忙看一下程序,关于串口操作的(急!!!在线等待) 在线等待!!JBiulder 7 如何注册?急啊 使用datasource连接数据库问题,急! 有没有JCertify5.0下载? java在bmp图片上签名添加文艺或者水印 如何设置JTable的网格线的尺寸? 急!做串口通讯的包comm.jar的windows版本在sun网站上找不到了????
Class c = cl.findLoadedClass("name");if (c != null) ... ...
比如上面的findLoadedClass可以扩写为public /*
*自定义加载类
**/
import java.io.*;public class MyClassLoader extends ClassLoader{
//读取一个文件的内容
private byte[] getBytes(String filename) throws IOException{
File file=new File(filename);
long len=file.length();
byte[] raw=new byte[(int)len];
FileInputStream fin=new FileInputStream(file);
int r=fin.read(raw);
if(r!=len) throw new IOException("Can't read all,"+r+"!="+len);
fin.close();
return raw;
} private boolean compile(String javaFile) throws IOException
{
System.out.println("CCL:Compiling "+javaFile+"...");
//调用系统的javac命令
Process p=Runtime.getRuntime().exec("javac "+javaFile);
try{
//其他线程都等待这个线程完成
p.waitFor();
}catch(InterruptedException ie){
System.out.println(ie);
}
int ret=p.exitValue();
return ret==0;
}
public Class loadClass(String name,boolean resovle) throws ClassNotFoundException
{
Class clas=null;
clas=findLoadedClass(name);
//这里说明了包的表示
String fileStub=name.replace('.','/');
String javaFilename=fileStub+".java";
String classFilename=fileStub+".class";
File javaFile=new File(javaFilename);
File classFile=new File(classFilename);
//如果存在class文件就不编译
if(javaFile.exists()&&(!classFile.exists()||javaFile.lastModified()>classFile.lastModified()))
{
try{
if(!compile(javaFilename)||!classFile.exists())
{
throw new ClassNotFoundException("ClassNotFoundExcetpion:"+javaFilename);
}
}catch(IOException ie)
{
throw new ClassNotFoundException(ie.toString());
}
}
try{
byte[] raw=getBytes(classFilename);
//通过读入数据来构造一个类结构,这是核心
clas=defineClass(name,raw,0,raw.length);
}catch(IOException ie){
}
if(clas==null)
{
clas=findSystemClass(name);
}
System.out.println("findSystemClass:"+clas);
if(resovle && clas!=null)
{
resolveClass(clas);
}
if(clas==null)
{
throw new ClassNotFoundException(name);
}
return clas;
}
}/**
* 测试自定义加载类MyClassLoader
*
*/
import java.lang.reflect.*;public class MyRun
{
public static void main(String[] args) throws Exception
{
String progClass=args[0];
String progArgs[]=new String[args.length-1];
System.arraycopy(args,1,progArgs,0,progArgs.length);
MyClassLoader ccl=new MyClassLoader();
Class clas=ccl.loadClass(progClass);
//返回一个class的type
Class[] mainArgType={(new String[0]).getClass()};
Method main=clas.getMethod("main",mainArgType);
Object argsArray[]={progArgs};
main.invoke(null,argsArray);
}
}/**
* 测试类.
*/
public class Test{
public static void main(String[] args)
{
if(args.length!=1)
{
System.err.println("Error,exit!");
System.exit(1);
}
String name=args[0];
System.out.println("Hello,"+name);
}
}运行如下:
F:\>java MyRun Test Yzl
findSystemClass:class java.lang.Object
findSystemClass:class Test
findSystemClass:class java.lang.String
findSystemClass:class java.lang.System
findSystemClass:class java.lang.StringBuffer
findSystemClass:class java.io.PrintStream
Hello,YzlF:\>
如果我的操作系统中运行了多个JAVA虚拟机怎么办?
操作系统里不是可以运行多个java.exe进程的吗