|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。
在经由一段工夫的歇息以后,DennisSosnoski又返来推出了他的Java编程的静态性系列的第5部分。您已在后面的文章中看到了怎样编写用于转换Java类文件以改动代码举动的程序。在本期中,Dennis将展现怎样利用Javassist框架,把转换与实践的类加载历程结合起来,用以举行天真的“立即”面向方面的特征处置。这类办法同意您决意想要在运转时改动的内容,并潜地在每次运转程序时做出分歧的修正。在全部过程当中,您还将更深切地了解向JVM中加载类的一样平常成绩。
在第4部分“用Javassist举行类转换”中,您进修了怎样利用Javassist框架来转换编译器天生的Java类文件,同时写回修正过的类文件。这类类文件转换步骤关于做出持久变动是很幻想的,可是假如想要在每次实行使用程序时做出分歧的变动,这类办法就纷歧定很便利。关于这类临时的变动,接纳在您实践启动使用程序时起感化的办法要好很多。
JVM系统布局为我们供应了如许做的便当路子DD经由过程利用classloader完成。经由过程使用classloader挂钩(hook),您能够拦阻将类加载到JVM中的历程,并在实践加载这些类之前转换它们。为了申明这个历程是怎样事情的,我将起首展现类加载历程的间接拦阻,然后展现Javassist怎样供应了一种可在您的使用程序中利用的便当捷径。在全部过程当中,我将使用取自本系列之前文章中的代码片段。
加载地区
运转Java使用程序的一般体例是作为参数向JVM指定主类。这关于尺度操纵没有甚么成绩,可是它没有供应实时拦阻类加载历程的任何路子,而这类拦阻对年夜多半程序来讲是很有效的。正如我在第1部分“类和类装进”中所会商的,很多类乃至在主类还没有入手下手执行之前就已加载了。要拦阻这些类的加载,您必要在程序的实行过程当中举行某种水平的重定向。
侥幸的是,摹拟JVM在运转使用程序的主类时所做的事情是相称简单的。您所需做的就是利用反射(这是在不得第2部分中先容的)来起首找到指定类中的静态main()办法,然后利用预期的命令行参数来挪用它。清单1供应了完成这个义务的示例代码(为复杂起见,我省略了导进和非常处置语句):
清单1.Java使用程序运转器
public class Run
{
public static void main(String[] args) {
if (args.length >= 1) {
try {
// load the target class to be run
Class clas = Run.class.getClassLoader().
loadClass(args[0]);
// invoke "main" method of target class
Class[] ptypes =
new Class[] { args.getClass() };
Method main =
clas.getDeclaredMethod("main", ptypes);
String[] pargs = new String[args.length-1];
System.arraycopy(args, 1, pargs, 0, pargs.length);
main.invoke(null, new Object[] { pargs });
} catch ...
}
} else {
System.out.println
("Usage: Run main-class args...");
}
}
}
要利用这个类来运转Java使用程序,只需将它指定为java命令的方针类,前面随着应用程序的主类和想要传送给使用程序的其他任何参数。换句话说,假如用于运转Java使用程序的命令为:
java test.Test arg1 arg2 arg3
您响应地要经由过程以下命令利用Run类来运转使用程序:
java Run test.Test arg1 arg2 arg3
<p>
J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看NetBeans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。 |
|