问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JAVA 中强制执行一个类的方法

发布网友 发布时间:2022-05-10 10:23

我来回答

5个回答

热心网友 时间:2023-07-26 02:13

动态编译JAVA程序

对于很多应用系统,常常需要动态装载和执行类和代码片断,这有利于部署的简易性和系统设计上的灵活性。本文给出了一个比较全面的介绍,值得参考。

在Sun JDK 1.2及后续版本中,包含了一组可在程序运行时刻编译和执行Java代码的API。这些API被包含在tools.jar类库中。这个功能允许Java程序在运行时动态编译、执行小的代码块,在有些情况下这个功能会让Java应用程序的架构更加灵活、开放。

本文假定读者已经在计算机中安装并配置好了Sun JDK 1.2或更高的版本,并对javac编译器命令有所了解。

在Java程序中使用编译器
假定要使用javac命令编译 /home/mytest目录下Test.java文件,并设定class文件存放在/home/mytest/classes路径下,输入下面命令:

javac -d /home/mytest/classes Test.java
达到同样的目的,也可以使用Sun提供的一个Java编译器的API来实现。它的使用也很简单,核心代码段如下:


String[] args = new String[] {“-d”, “/homemytestclasses”, “Test.java”};
Int status = javac.compile(args);

javac编译工具被安装在JDK根目录的/bin目录下,负责将源代码编译成运行于JVM的字节码。事实上,我们经常使用/bin目录下的javac编译工具来编译Java源文件。如果在Java程序中动态编译任意制定的Java语句,使用这个外部的javac编译器就显得不够灵活了。虽然有时可使用Runtime类来执行一个外部命令,但如果想知道代码是否被编译通过、编译时发生了什么错误,用Runtime类的exec()方法就很难实现了。

在Sun的JDK 1.2及后续版本中,JDK安装路径的/lib路径下包含了一个tools.jar文件,这个类库包含了一个完整的编译器包。com.sun.tools.javac.Main是编译器的主类入口,如果已经熟悉了javac编译器命令行的使用方法,很容易理解这个类的使用方法。方法compile(String[] p)执行编译动作,参数p是一个String数组,用来存放javac命令的参数选项,编译后的状态返回一个Int值,其对应值参考如下表所示:

表 状态参数与对应值
EXIT_OK 0
EXIT_ERROR 1
EXIT_CMDERR 2
EXIT_SYSERR 3
EXIT_ABNORMAL 4
在程序执行时编译和执行Java语句
从上面一段中,我们已经基本了解了动态编译一个Java文件的方法。那么,如何运行时动态编译指定的Java语句呢?这里需要一个技巧。

假设要动态编译的Java条语句如下:

System.out.println(“Hello,This runtime code!”);
编译器不支持编译单个Java语句,被编译的对象必须是一个以.java为后缀的、结构合法的类源程序文件,所以需要对这个语句进行改造,变成一个完整的类,并把这条语句置入main方法中,便于测试。

public class <临时类文件名> {
public static void main(String[] args) throws Exception {
System.out.println(“Hello,This runtime code!”);
}
}
这样,欲动态编译的代码已经被程序动态拼装成了上面那段代码,准备工作还没有结束,不过看起来工作在趋向稍微的复杂化。因为上述代码当前还存放在内存中,编译器似乎对一个硬盘文件更感兴趣。我们需要引用java.io.File类(JDK 1.2以上),创建一个临时的文件来存放上述代码的内容。java.io.File类的静态方法createTempFile()方法保证所创建的文件名是不重复的,这样会增大这段程序的灵活性。灵活性取决于真正应用到系统架构中的策略。

System.getProperty(“user.dir”)用来获得当前路径,在这里作为临时文件的存放目录。

File file;
file = File.createTempFile(“JavaRuntime”, “.java”, new File(System.getProperty(“user.dir”)));
String filename = file.getName();
String classname = getClassName(filename);
//将代码输出到文件
PrintWriter out = new PrintWriter(new FileOutputStream(file));
out.println(“public class” + classname + “ {”};
out.println(“..代码..”);
out.println(“}”);
//关闭文件流
out.flush();
out.close();
我们约定被创建的临时文件名以“JavaRuntime”为头缀(可任意命名),后缀名以“.java”结尾。一个待编译的Java源文件已被动态生成。下一步要从com.sun.tools.javac包中创建一个Main实例,调用javac.compile()方法编译这个临时文件:

Private static com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
String[] args = new String[] {“-d”, System.getProperty(“user.dir”),filename };
Int status = javac.compile(args);
假定临时文件通过了编译器文法验证等验证,编译成功(status值等于0,参看前表),在当前程序的运行目录下就会多了一个Java类文件。我们将通过执行这个Java 类文件,来模拟执行欲动态编译代码的结果。

Java提供在运行时刻加载类的特性,可动态识别和调用类构造方法、类字段和类方法。java.lang.reflect.Method实现了Member接口,可以调用接口的方法来获得方法类的名称、修饰词等。方法getRuturnType()、getParameterTypes()、getExeptionTypess()等返回被表示方法的构造信息。Method另一个重要的特性是可以调用invoke()执行这个方法(详细使用方法可以查看java.lang.reflect包文档)。下面这段代码中创建一个java.lang.reflect.Method类方法,调用getMethod()方法获得被拼装的main方法的映射,这段代码如下:

try {
// 访问这个类
Class cls = Class.forName(classname);
//调用main方法
Method main = cls.getMethod(“main”, new Class[] { String[].class });
main.invoke(null, new Object[] { new String[0] });
}catch (SecurityException se) {
debug(“access to the information is denied:” + se.toString());
}catch (NoSuchMethodException nme) {
debug(“a matching method is not found or if then name is or :

” + nme.toString());
}catch (InvocationTargetException ite) {
debug(“Exception in main: ” + ite.getTargetException());
}catch (Exception e){
debug(e.toString());
}
运行结果参如下:

Hello,This runtime code!

示范程序
下面给出了一个简单的Java程序,这个程序说明了如何利用Sun的javac编译器完成动态编译Java语句。运行该程序需要计算机安装JDK 1.2以上版本,并在classpath中或运行时指定tools.jar文件位置。

程序结构:

◆ compile() 编译Java代码,返回生成的临时文件;
◆ run()运行编译的class文件;
◆ debug()输出调试信息;
◆ getClassName()从一个Java源文件获得类名;
◆ readLine()从控制台读取用户输入的Java Code。

Import java.io.File;

Public class RuntimeCode{
/**编译器*/
private static com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
/**等待用户输入JavaCode,然后编译、执行*/
public static void main(String[] args) throws Exception{

run(compile(code));
}
/**编译JavaCode,返回临时文件对象*/
private synchronized static File compile(String code)

throws IOException,Exception {
File file;
//在用户当前文件目录创建一个临时代码文件
file = File.createTempFile(“JavaRuntime”, “.java”,
new File(System.getProperty(“user.dir”)));
//当虚拟机退出时,删除此临时java源文件
file.deleteOnExit();
//获得文件名和类名字
String filename = file.getName();
String classname = getClassName(filename);
//将代码输出到文件
PrintWriter out = new PrintWriter(new FileOutputStream(file));
out.println(“/**”);

//关闭文件流
out.flush();
out.close();
//编译代码文件
String[] args = new String[] {“-d”, System.getProperty(“user.dir”),filename };
//返回编译的状态代码
int status = javac.compile(args);
//处理编译状态

}
/**执行刚刚编译的类文件*/
private static synchronized void run(File file)


//当虚拟机退出时,删除此临时编译的类文件
new File(file.getParent(), classname + “.class”).deleteOnExit();
try {
// 访问这个类
Class cls = Class.forName(classname);
//映射main方法
Method main = cls.getMethod(“main”, new Class[] { String[].class });
//执行main方法
main.invoke(null, new Object[] { new String[0] });
}catch (SecurityException se) {

}
}
/**打印调试信息*/
private static void debug(String msg) {
System.err.println(msg);
}
/**根据一个java源文件名获得类名*/
private static String getClassName(String filename){
return filename.substring(0,filename.length()-5);
}
/**从控制台获得用户输入的Java代码段*/

}
编译运行上述代码,在please input java code提示下输入以下代码:

for(int i=0;i<10;i++){System.out.println(“this is:”+i);}
运行结果如下所示:

Please input java code:

for(int i=0;i<10;i++){System.out.println(“this is:”+i);}
wait....
--------------------
this is:0
this is:1
this is:2
this is:3
this is:4
this is:5
this is:6
this is:7
this is:8
this is:9
总结
在大中型企业应用系统平台中,使用代码动态编译技术结合OO编程模型,可在系统不菪机条件下保证系统的可扩展性和伸缩性。如果你是一个Java程序员,稍加调整以上代码,还可以帮助调试小段的Java代码.

热心网友 时间:2023-07-26 02:14

呵呵,一楼的兄台有点火气。不过你这问题确实很无知。建立你先去了解下什么是JAVA再说。
运行类,运行的是类中的什么?就是方法,JAVA中所有的规范都是如此,最根本的就是方法。所以运行一个类,就是要运行类中的方法或调用类中的属性。除此以外没有其他的。

热心网友 时间:2023-07-26 02:14

有两种可能,一种是常规方法,一种是使用static关键字的方法。


public class Person {
    public void speak(){
    }
    //带static关键字
    public static void run(){
    }
}

一、常规,例如: Person p = new Person();  p.speak();即生成对象p调用speak()方法.

二、static方法, 直接调用Person.run();

热心网友 时间:2023-07-26 02:15

运行类,那就得,运行里面得方法,不仅仅JAVA如此,其他语言也是一样的啊,这个问题,问的太弱智。。。

热心网友 时间:2023-07-26 02:15

LZ没学过java吧!?不执行类中的方法怎么执行类?!这不搞笑么?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...△=口+口+口,问△、o、口谁大谁小,小学一年级数学期末附加题_百度知 ... 一年级数学△ +△ +〇 +〇 +〇=27,△ +△+ 〇 +〇+ △ +△=22问△=... 上海南浦大桥长途客运中心到虹桥机场第二航站楼怎么走? 上海浦东国际机场2号航站到上海长途汽车客运总站,最快怎么走,用时多少... 从上海长途汽车客运总站到虹桥机场2号航站楼 木头爱上烈火简介 省直遴选面向哪些群体? 义务教育阶段的学生有什么权利和义务? ngclz型带制动轮鼓形齿式联轴器内容简介 GⅡCL型基本型(窄型)鼓形齿式联轴器基本参数 辩论赛辩题是联合国应该更关注贫困还是环境,我方是环境,应怎样论述,谢谢 求助! 要第三届国际大专辩论赛出赛第一场(各国*应该全面禁烟)的辩词 我QQ空间被封了,是不是永久打算这样?都三个月了?还在说3天帮我解决?怎样才能解决。我现在在发现。 是advice sb to do还是advise sb to do advice与advise可互用吗?有advice sb to do sth吗?advise的过去式是什么? advise sb to do sth.中的to do 作状语呢?还是宾补呢? advise sb to do与suggest sb to do的区别,谢谢,在线等 advice sb to do sth 等于suggest sb doing sth吗?用法上有什 advicesbtodosth等于suggestsbdoingsth吗 advise sb to do还是doing呢? advise sb. to do; advise doing ;advise that sb. (should) do有什么不同 qq空间被永久封闭申诉了好几次qq邮箱都没反应啊 是advice sb to do还是advise sb to do? advice to do和advice doing的区别是什么? QQ空间:很抱歉,由于您的空间存在不符合互联网相关安全规范等内容,暂不支持发表带图片的说说? QQ空间被永久封闭怎么办,QQ空间永久被 advice sb to do sth造句 分屏按掉后如何变成球华为的? 请问有谁会做铁板鱿鱼的飘香酱,酱香味很好闻、很鲜、很好吃、飘香很远那种。 做铁板鱿鱼的飘香酱 《最高人民*关于审理人身损害赔偿案件适用法律若干问题的解释》_百度问一问 人身损害赔偿法院的官司怎么审理 《最高人民*关于审理人身损害赔偿案件适用法律若干问题的解释》第九条的理解 《最高院关于审理人身损害赔偿案件适用法律若干问题的解释》 如何理解最高人民*《关于审理人身损害赔偿案件适用法律若干问题的解释》第六条的规定? 《最高人民*关于审理人身损害赔偿案件适用法律若干问题的解释》是指怎样的赔偿?谢谢! 《侵权责任法》实施后,《最高人民*关于审理人身损害赔偿案件适用法律若干问题的解释》是否继续有效? 如何用java命令运行在包中的类 人身损害赔偿案件适用法律若干问题的解释还有效吗 java中如何使用按钮按下后执行某个类,谢谢!! 如何运行一个文件夹内的Java类? JAVA的一个包中有若干类,怎么同时运行。 java命令怎么运行一个包里的多个class文件 怎么运行JAVA包中的类文件 java中怎么在一个类中调用另一个类的全部方法 形容夫妻恩爱的诗句有哪些? 洗衣机购买要注意什么,买二手的好不好? 夫妻诗句经典语录 注册公司申请车牌有风险吗 洗衣机用二手的可以么