【分红猪源码】【拍卖英雄联盟源码】【任务平台源码出售】aslist 源码

时间:2024-12-24 08:00:47 编辑:Lightroom源码 来源:评级网源码

1.如何用maven将java8写的代码编译为java6平台的
2.Java Arrays.asList 和 new ArrayList(Arrays.asList()) 的源码对比
3.java.lang.UnsupportedOperationException问题分析及解决
4.源代码是什么

aslist 源码

如何用maven将java8写的代码编译为java6平台的

       ã€€ã€€åœ¨ä¸€èˆ¬çš„Java应用开发过程中,开发人员使用Java的方式比较简单。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其“编写一次,到处运行(Write once, run anywhere)” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改。这个时候就需要用到本文中将要介绍的相关技术。首先介绍一下如何动态编译Java源文件。

       ã€€ã€€åŠ¨æ€ç¼–译Java源文件

       ã€€ã€€åœ¨ä¸€èˆ¬æƒ…况下,开发人员都是在程序运行之前就编写完成了全部的Java源代码并且成功编译。对有些应用来说,Java源代码的内容在运行时刻才能确定。这个时候就需要动态编译源代码来生成Java字节代码,再由JVM来加载执行。典型的场景是很多算法竞赛的在线评测系统(如PKU JudgeOnline),允许用户上传Java代码,由系统在后台编译、运行并进行判定。在动态编译Java源文件时,使用的做法是直接在程序中调用Java编译器。

       ã€€ã€€JSR 引入了Java编译器API。如果使用JDK 6的话,可以通过此API来动态编译Java代码。比如下面的代码用来动态编译最简单的Hello World类。该Java类的代码是保存在一个字符串中的。

       ã€€ã€€ public class CompilerTest {

       ã€€ã€€ public static void main(String[] args) throws Exception {

       ã€€ã€€ String source = "public class Main { public static void main(String[] args) { System.out.println(\"Hello World!\");} }";

       ã€€ã€€ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

       ã€€ã€€ StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

       ã€€ã€€ StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);

       ã€€ã€€ Iterable< extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);

       ã€€ã€€ CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);

       ã€€ã€€ boolean result = task.call();

       ã€€ã€€ if (result) {

       ã€€ã€€ System.out.println("编译成功。");

       ã€€ã€€ }

       ã€€ã€€ }

       ã€€ã€€

       ã€€ã€€ static class StringSourceJavaObject extends SimpleJavaFileObject {

       ã€€ã€€

       ã€€ã€€ private String content = null;

       ã€€ã€€ public StringSourceJavaObject(String name, String content) throwsURISyntaxException {

       ã€€ã€€ super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);

       ã€€ã€€ this.content = content;

       ã€€ã€€ }

       ã€€ã€€

       ã€€ã€€ public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {

       ã€€ã€€ return content;

       ã€€ã€€ }

       ã€€ã€€ }

       ã€€ã€€ }

       ã€€ã€€å¦‚果不能使用JDK 6提供的Java编译器API的话,可以使用JDK中的工具类com.sun.tools.javac.Main,不过该工具类只能编译存放在磁盘上的文件,类似于直接使用javac命令。

       ã€€ã€€å¦å¤–一个可用的工具是Eclipse JDT Core提供的编译器。这是Eclipse Java开发环境使用的增量式Java编译器,支持运行和调试有错误的代码。该编译器也可以单独使用。Play框架在内部使用了JDT的编译器来动态编译Java源代码。在开发模式下,Play框架会定期扫描项目中的Java源代码文件,一旦发现有修改,会自动编译 Java源代码。因此在修改代码之后,刷新页面就可以看到变化。使用这些动态编译的方式的时候,需要确保JDK中的tools.jar在应用的 CLASSPATH中。

       ã€€ã€€ä¸‹é¢ä»‹ç»ä¸€ä¸ªä¾‹å­ï¼Œæ˜¯å…³äºŽå¦‚何在Java里面做四则运算,比如求出来(3+4)*7-的值。一般的做法是分析输入的运算表达式,自己来模拟计算过程。考虑到括号的存在和运算符的优先级等问题,这样的计算过程会比较复杂,而且容易出错。另外一种做法是可以用JSR 引入的脚本语言支持,直接把输入的表达式当做JavaScript或是JavaFX脚本来执行,得到结果。下面的代码使用的做法是动态生成Java源代码并编译,接着加载Java类来执行并获取结果。这种做法完全使用Java来实现。

       ã€€ã€€ private static double calculate(String expr) throws CalculationException {

       ã€€ã€€ String className = "CalculatorMain";

       ã€€ã€€ String methodName = "calculate";

       ã€€ã€€ String source = "public class " + className

       ã€€ã€€ + " { public static double " + methodName + "() { return " + expr +"; } }";

       ã€€ã€€ //省略动态编译Java源代码的相关代码,参见上一节

       ã€€ã€€ boolean result = task.call();

       ã€€ã€€ if (result) {

       ã€€ã€€ ClassLoader loader = Calculator.class.getClassLoader();

       ã€€ã€€ try {

       ã€€ã€€ Class<?> clazz = loader.loadClass(className);

       ã€€ã€€ Method method = clazz.getMethod(methodName, new Class<?>[] { });

       ã€€ã€€ Object value = method.invoke(null, new Object[] { });

       ã€€ã€€ return (Double) value;

       ã€€ã€€ } catch (Exception e) {

       ã€€ã€€ throw new CalculationException("内部错误。");

       ã€€ã€€ }

       ã€€ã€€ } else {

       ã€€ã€€ throw new CalculationException("错误的表达式。");

       ã€€ã€€ }

       ã€€ã€€ }

       ã€€ã€€ä¸Šé¢çš„代码给出了使用动态生成的Java字节代码的基本模式,即通过类加载器来加载字节代码,创建Java类的对象的实例,再通过Java反射API来调用对象中的方法。

       ã€€ã€€Java字节代码增强

       ã€€ã€€Java 字节代码增强指的是在Java字节代码生成之后,对其进行修改,增强其功能。这种做法相当于对应用程序的二进制文件进行修改。在很多Java框架中都可以见到这种实现方式。Java字节代码增强通常与Java源文件中的注解(annotation)一块使用。注解在Java源代码中声明了需要增强的行为及相关的元数据,由框架在运行时刻完成对字节代码的增强。Java字节代码增强应用的场景比较多,一般都集中在减少冗余代码和对开发人员屏蔽底层的实现细节上。用过JavaBeans的人可能对其中那些必须添加的getter/setter方法感到很繁琐,并且难以维护。而通过字节代码增强,开发人员只需要声明Bean中的属性即可,getter/setter方法可以通过修改字节代码来自动添加。用过JPA的人,在调试程序的时候,会发现实体类中被添加了一些额外的 域和方法。这些域和方法是在运行时刻由JPA的实现动态添加的。字节代码增强在面向方面编程(AOP)的一些实现中也有使用。

Java Arrays.asList 和 new ArrayList(Arrays.asList()) 的对比

       在编程中,处理数组和列表是源码常见的任务。文章中对比了`Arrays.asList(array)`和`new ArrayList(Arrays.asList(array))`两种将数组转换为列表的源码方法。首先看`Arrays.asList`。源码这个方法将数组包装为一个固定长度的源码`List`对象。它不会复制数组数据,源码分红猪源码只是源码创建了一个视图,允许在程序中使用`List`接口。源码然而,源码不能修改`List`的源码长度,包括添加或删除元素。源码可以修改`List`中的源码数组元素,改变原始数组的源码值。尝试向`List`添加元素时,源码程序会抛出`UnsupportedOperationException`异常。源码拍卖英雄联盟源码

       接下来,看`ArrayList(Arrays.asList(array))`。它从数组创建一个`List`,但不同的是,这个`List`的数据是从数组中拷贝来的。这意味着创建的`List`与原始数组无关,对`List`中数据的任务平台源码出售操作不会影响到数组。因此,可以对`List`中的元素进行添加和删除操作。修改`List`中的元素时,原始数组不会被修改。通过访问JDK源代码,可以发现`Arrays.asList`返回的`ArrayList`只包装了数组,而没有实现`add`和`remove`方法。美工首页制作源码

       总结,`Arrays.asList`方法创建的`List`不允许修改长度或添加删除元素,修改`List`元素会导致原始数组改变。而`ArrayList(Arrays.asList(array))`方法创建的`List`可以执行常规操作,修改`List`元素不会影响原始数组。两种方法各有适用场景,选择时需根据实际需求考虑。九旺棋牌源码

java.lang.UnsupportedOperationException问题分析及解决

       在编写代码过程中,遇到了一个令人困惑的报错问题:java.lang.UnsupportedOperationException。这问题源自代码中的一行:psParamList.remove("GPRS=1");那么,为什么会产生这种报错呢?让我们一起来深入分析并解决这个问题。

       报错的源头在于psParamList的remove操作。起初,我们对这一现象感到不解。难道是psParamList不支持remove方法?显然,这与我们的预期不符。随后,我们查阅了Arrays.asList方法的源码,发现返回的ArrayList实际上是Arrays类的静态内部类,即Arrays$ArrayList。而这一类并非java.util.ArrayList。在深入源码后,我们发现Arrays$ArrayList类并未实现remove、add等方法,因此在执行这些操作时,就会触发java.lang.UnsupportedOperationException错误。

       通过以上分析,我们已经找到了问题的根源。为了解决这个问题,我们需要对代码进行相应的调整。具体而言,我们可以将Arrays.asList方法替换为Collections.singletonList或者使用java.util.Arrays的asList方法。这样,我们便可以利用Java集合框架中的ArrayList类,从而实现remove等操作。通过这种方式,不仅解决了java.lang.UnsupportedOperationException错误,同时也保证了代码的正常运行。

源代码是什么

       说白了就是各种编程语言,你现在所用的所有软件都是用各种源代码编出来的,大概样子就像:

       <!--STATUS OK--><html><head>

       <meta /w.gif?q=%D4%B4%B4%FA%C2%EB&"+sQ+"path="+p+"&t="+new Date().getTime(); return true}

       function al_c(A){ while(A.tagName!="TABLE")A=A.parentNode;return A.getAttribute("id")}

       //--></script></head>

       <body onload="document.f1.reset();" link="#CDC">

       <table width="%" height="" align="center" cellpadding="0" cellspacing="0">

       <form name=f1 action="/s">

       <tr valign=middle>

       <td width="%" valign="top" style="padding-left:8px;width:px;" nowrap>

       <a href="/"><img src="/img/logo-yy.gif" border="0" width="" height="" alt="到百度首页"></a>

       </td>

       <td>   </td>

       <td width="%" valign="top">

       <div class="Tit">

       <a href="/ns?cl=2&rn=&tn=news&word=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'news'})">新闻</a>   <span class="fB">网页</span>   <a href="/f?kw=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'tieba'})">贴吧</a>   <a href="/q?ct=&pn=0&tn=ikaslist&rn=&word=%D4%B4%B4%FA%C2%EB&fr=wwwt" onmousedown="return c({ 'fm':'tab','tab':'zhidao'})">知道</a>   <a href="/m?tn=baidump3&ct=&lm=-1&word=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'mp3'})">MP3</a>   <a href="/i?tn=baiduimage&ct=&lm=-1&cl=2&word=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'pic'})"></a>   <a href="/v?ct=&rn=&pn=0&db=0&s=&word=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'video'})">视频</a>   <a href="/s?lm=0&si=&rn=&ie=gb&ct=&wd=%D4%B4%B4%FA%C2%EB&tn=baidu" target="_blank" onmousedown="return c({ 'fm':'tab','tab':'dict'})">词典</a>   <!--bds<a href="$bdDSURL$">硬盘</a>  -->

       </div>