http://www.java2s.com/Tutorial/Java/0120__Development/CompileString.htm
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Iterator;
import java.util.NoSuchElementException;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
public class CompileString {
public static void main(String[] args) throws Exception {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
String program = "class Test{" + " public static void main (String [] args){"
+ " System.out.println (\"Hello, World\");"
+ " System.out.println (args.length);" + " }" + "}";
Iterable<? extends JavaFileObject> fileObjects;
fileObjects = getJavaSourceFromString(program);
compiler.getTask(null, null, null, null, null, fileObjects).call();
Class<?> clazz = Class.forName("Test");
Method m = clazz.getMethod("main", new Class[] { String[].class });
Object[] _args = new Object[] { new String[0] };
m.invoke(null, _args);
}
static Iterable<JavaSourceFromString> getJavaSourceFromString(String code) {
final JavaSourceFromString jsfs;
jsfs = new JavaSourceFromString("code", code);
return new Iterable<JavaSourceFromString>() {
public Iterator<JavaSourceFromString> iterator() {
return new Iterator<JavaSourceFromString>() {
boolean isNext = true;
public boolean hasNext() {
return isNext;
}
public JavaSourceFromString next() {
if (!isNext)
throw new NoSuchElementException();
isNext = false;
return jsfs;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
}
class JavaSourceFromString extends SimpleJavaFileObject {
final String code;
JavaSourceFromString(String name, String code) {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
this.code = code;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
http://www.java2s.com/Tutorial/Java/0120__Development/CompileJavafile.htm
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class CompileFiles2 {
public static void main(String[] args) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> dc;
dc = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager sjfm;
sjfm = compiler.getStandardFileManager(dc, null, null);
Iterable<? extends JavaFileObject> fileObjects;
fileObjects = sjfm.getJavaFileObjects(args);
compiler.getTask(null, sjfm, dc, null, null, fileObjects).call();
for (Diagnostic d : dc.getDiagnostics()) {
System.out.println(d.getMessage(null));
System.out.printf("Line number = %d\n", d.getLineNumber());
System.out.printf("File = %s\n", d.getSource());
}
}
}
Play! Framework 是07年的一个项目,08年开源,09年11月25日发布了1.0版。发布后我就一直在学习这个框架。现在正式发布版本已经是1.01版,而且1.1版本也在每日更新。可以在http://download.playframework.org 下载已发布版本,和每日的最新版。
学习Play!的过程中,最经常的感受就是——简直太简单了!并不是说Play!是一个设计简单的框架,相反学习中发现处处都会发现Play!设计的完整,这种完整性甚至包括网站设计和学习文档。Play!的简单之处在于它学习和使用起来非常简单。使用Play!新建项目,所有的目录结构都会自动建立。Play!摒弃了传统的JSP,Servlet技术(这太伟大了),自己提供了一套非常易用的MVC 框架。Play!内建了JPA的支持,内置了Hibernate作为默认的持久化引擎。
在Play!中,持久化只需要集成Model类并加入@Entity注解:

代码
1 ...
2
3 @Entity
4
5 public class User extends Model
6
7 {
8
9 public String name;
10
11 public String password;
12
13 public User(String name,String password)
14
15 {
16
17 this.name=name;
18
19 this.password=password;
20
21 }
22
23 }
24
然后,创建User并保存到数据库就只需要一行代码:
1 new User("zxsoft","password").save();
这就是全部代码,不需要写任何Mapping配置文件。
Play! 还内置了HSQLDB 数据库,支持内存数据库,非常方便做项目开发和测试。
Play!的Controller采用命名约定:
1 <form action="@{Application.createUser}">
2 <input name="name" />
3 <input name="password" />
4 <input type="submit" value="Create User" />
5 </form>
然后在Application类中,建立createUser方法:
1 ...
2 public class Application{
3 ...
4 public static void createUser(String name,String password)
5 {
6 User user=new User(name,password).save();
7 render(user);
8 }
9 }
无需其他任何配置,Play!会自动映射form中的name和password参数至createUser方法。
View层Play!使用以Groovy语法写好的html模板中去以render()方法的参数渲染,并将结果回传给客户端。
而这一切,全部都不需要配置。
Play!虽然使用简单,扩展性却非常强大,篇幅所限所述不能详尽。http://www.playframework.org 是Play!的官方网站,推荐大家到这儿看看。Play!的文档非常详细,教程中有份手把手做一个Blog引擎的教程,相信照着做一下之后一定会让你学会Play! Framework,那时你一定会爱上她的!
- Java
- 主题
- 语言设计,
- 语言,
- 变更
- 标签
- 语言特性,
- 闭包(Closures)
近日Mark Reinhold在Devoxx的演讲中宣布JDK 7将增加闭包特性。由于添加了这个饱受 争议的特性,JDK 7的发布时间将推迟至明年9月左右。
Project Coin(旨在对Java 7进行小幅度的语言改进)的首席工程师Joseph D. Darcy已经确认语言的下一版本将增加某些“轻量级”的闭包:
… JDK 7将增加闭包特性,增加的闭包要比BGGA(即Closures for the Java Programming Language,译者注)所提出的闭包更小巧,因此JDK 7的发布时间将推迟至明年9月左右:
Alex Miller也参加了此次大会,他指出尽管过去社区已经给出了3个不同的提案,但Sun对于闭包的态度还是很消极:
我真的是无语了。这几年Sun总强调大家并没有就闭包这个问题达成共识,也延误了成立闭包JSR或专家组的时机,但实际情况却是社区已经给出了3个提案,每个提案都有相应的原型。
就在Mark Reinhold宣布这个消息不久,Neal Gafter(已有的3个闭包提案中BGGA提案的发起人之一,BGGA其实就是4位发起者名字的首字母缩写,他们是Bracha、Gafter、Gosling和von der Ahé)就发布了一个“简化的提案”:
该提案有如下变化之处:- 将控制调用(control invocation)语法移到另一个单独的规范中。
- 将术语闭包字面量(closure literal)替换为lambda表达式(lambda expression)。
- 我们检查了lambda表达式的语法,从Clang借鉴了一些精华。现在有两种形式的lambda表达式:expression lambda拥有控制表达式,而statement lambda拥有控制语句。
- 将术语闭包对象(closure object)替换为函数对象(function object)。
- 将术语闭包变换(closure conversion)替换为lambda变换(lambda conversion),而控制调用语法将拥有一个单独的块变换(block conversion)。
- 为return语句增加新的语义:现在可以从statement lambda中返回了。
- 将java.lang.Unreachable改为java.lang.Nothing,这一点借鉴了Scala。
- 移除对类型名null的支持。之前的版本在没有异常抛出时将null作为一个异常类型的占位符。现在,类型Nothing可以满足这个要求。
- 受限制检查。受限制(restricted)与不限制(unrestricted)的函数类型与闭包概念已经被移除了。现在所有的lambda表达式都是受限制的。我们可以通过控制调用语法将此前规范中的不限制闭包传递给方法。
- 增加方法引用支持:我们通过一个新引入的符号#将对方法的引用当作函数看待。该语法来源于javadoc中的交叉引用和FCM提案。
JDK 7这种突然间的变化令Fabrizio Giudici等很多人对决策的过程表示怀疑:
我不想谈论这么做好不好(你知道在我听说该提案既不是BGGA,也不是CICE,而是一个新提案时我就觉得这不是一件好事)。我只是惊诧于仅仅几周后Java 7就与Project Coin(知名的最终5提案)达成了一致,某些人几乎是瞬间就改变了主意。这到底是怎样的一个决策过程呢?
啊哈,我知道了——他们一定是投硬币决定的,现在我终于知道Project Coin项目名字的来历了。我担心Java 7会变成最混乱的一个Java版本——如果你想干掉Java的话这么做倒是不错(因为现在大家的争论点还不算太多,比如Oracle的收购或是关于Jigsaw/OSGi的争论)。
与此类似,Geertjan Wielenga也觉得增加闭包这个决定太出人意料了:
如果没人想问决策的过程是怎样的,为何得出这个结论的话,那这绝对是个好消息,或许还是最好的消息呢。首先,我们拥有一堆提案,但根本没人看。其次,突然间我们就拥有了“简单闭包”(我想知道是否现有的所有提案都可以叫做“复杂闭包”呢。难道简单就是闭包的全部么?)。好吧,闭包看起来会很简单,没有非局部的return(non-local return)、没有控制语句、无法访问非final变量。我还是想问一下,到底是如何得出这个决定的?
Cay Horstmann针对这个新的BGGA提案给出了几个用例,与FCM提案何其相似:
我们真的不知道Sun到底想搞什么。之前我粗略地分析了一下BGGA 0.6a提案,总体上来说与现在的BGGA差不多。没人反对BGGA与FCM的相似性。没有非局部的return、用于lambda的#。由于需要在捕获前用@Shared注解突变变量(mutated variable),人们在编写之前可能需要考虑再三。
foreach(@Shared String v : values)
funcs.add( #() => v);
Alex Miller提到JDK发布的延期可能会让其他特性有机会加到最终的发布中,比如ParallelArray程序库,它为映射、过滤以及Java对象数组的裁剪提供了一套函数风格的API:
我在QCon上与Bob Lee聊了一会,他觉得JDK 7的延期有可能会将ParallelArray纳入进来并使用新的闭包支持。
摘要: 冷观PDM孟繁晶0、引言产品数据管理(ProductDataManagement,PDM)是二十世纪八十年代出现的一门信息管理技术,它主要解决了企业中大量产品数据存储与管理的问题。然而,随着IT技术与管理理念的不断发展,PDM的内涵与外延又不断得到拓展,并得到了各大企业的关注与支持。我国对PDM技术的广泛关注始于九十年代中期,一方面国内许多企业开始认同并实施PDM,另一方面国内各大高校及软件公司开...
阅读全文
从理论上讲,PDM相对于ERP应该是比较容易成功的,因为它至少有三方面优势:
首先,PDM服务于专业设计人员,只要能让设计人员的潜力得以发挥,PDM的价值就体现了,不会导致企业内权力再分配,引发的矛盾自然就少得多;
其次,PDM实施在业务上主要是企业的研发管理部门。和ERP不一样,少了很多业务部门之间协同的管理改造复杂难度。而且尽管不同企业的研发业务流程差异很大,但实际上这种流程的模块性很强,不需要做太过复杂的流程改进;
最后,PDM的使用人员往往是企业里计算机应用水平最高的,对软件的操作能力也很强,组织得好的话很容易成为实施的生力军,而不是习惯性的阻力者。
但为什么PDM在中国推广了相当长一段时间,却依然成功率不高呢?
技术基础不够
PDM从80年代到现在还只有20多年发展历史,技术上还在完善之中,特别是目前国内主流PDM产品在架构和技术上需要改进的空间还非常大。
此外,国际上对产品模型的研究始终没有停止,更没有提出广泛适用的标准,而不同CAD/CAPP/CAE/CAM供应商之间格式不统一,客观上增加了PDM产品数据接口的复杂程度和管理难度,在这点上PDM的技术复杂性远远大于ERP。
目前,国内供应商对国外很多PDM基础理论研究成果继承都不够,又怎么可能在自己的PDM系统中有效解决所有企业研发管理业务问题呢?
需求基础不够
中国企业的核心竞争力是什么?是低价格。这种竞争力对设计创新要求不高,但对生产组织,物流成本控制要求很高。
控制成本最直接的业务是财务,企业的财务工作基本上都是可以标准化统一管理的行为,而财务管理是ERP的核心流程,财务电算化的确能发挥巨大的效益,因此先财务后ERP,或者上ERP先管财务,成为很多企业客观的需求。
这种情况下企业对ERP需求优先于对PDM需求,其实,PDM最终是支持产品协同设计、创新设计的,而不是仅仅管理文档和产品的,这是狭义PDM的范畴。
中国现在有几个企业认为他们的核心竞争力是设计创新呢?如果答案是否定的,他们对PDM的期望就小很多,很多企业是上ERP解决不了基础数据录入反过来上PDM,并非他们一开始就认为,PDM能最有效地促进他们企业价值链的系统。所以导致了目前很多企业上PDM的最大作用竟然是让ERP用起来!
管理基础欠缺
ERP的推广是我国企业管理大量吸收国外的大规模流水生产、JIT生产模式,同精益生产、敏捷制造紧紧联系在一起的。现在,我国企业生产组织形态和计划经济时代已经完全不一样,这种管理上翻天覆地的变化导致企业对支撑先进管理思想的信息技术平台的极度渴望。
但是PDM导入的客观条件是企业实现了企业数据信息的标准化管理,广泛应用项目管理和并行工程管理模式才能形成需求,发挥巨大效益。
要注意的是:不是上PDM后推行项目管理和并行工程,也不是通过PDM贯彻标准化,而是因为这些管理工作用手工管理非常困难的时候通过PDM提高管理效率和水平!
而这还是中国企业正在走向制造大厂中还没有完全解决或者说正在着手解决的问题,所以PDM的管理基础还很欠缺,管理基础欠账过多,实施自然举步维艰。
市场人才比较稚嫩
业内普遍认为现在PDM公司和ERP公司运作水平差距还是很大的。
国内实施管理信息化项目的人才目前主要集中在ERP业务。PDM供应商缺少足够的人才贮备,或者说还没有能力吸引大量人才进入PDM领域为用户提供高质量服务,也就不能形成好的用户口碑,这样对市场的培养就极度不利。
而且中国国内PDM供应商基本上都来自于高校和研究院所,学术气浓厚,商业性不够,这和ERP公司大部分都是市场业务背景的人员有极大区别。
应用领域待拓展
含有大量数据或信息以及复杂流程的应用场所,如银行、海关、码头、政府、学校等都可以应用产品数据管理技术,制造业中流程型企业也可以应用产品数据管理技术。
这些企业往往是购买力最强对信息化应用也最坚决的企业,多少ERP豪华大单就诞生在这些行业,但是目前PDM市场还是在竞争最激烈、购买力相对比较低的机械制造业中扎堆。
应用领域不扩展,市场蛋糕就不大,也就让这个市场缺少了前进的动力。
摘要: 转自:http://www.router.net.cn/Article/26665.html如果不知道所要寻找的对象的持久化标识,那么你需要使用Hibernate查询。在这里拿出来和大家分享一下我的经验,希望对大家有用。Hibernate支持强大且易于使用的面向对象查询语言(HQL)。 如果希望通过编程的方式创建查询,Hibernate提供了完善的按条件(Query By Criteria, QB...
阅读全文
摘要: 当二十一世纪进入知识经济时代后,企业所面临的挑战也越来越严格。而善用信息技术于经营策略,绝对是企业赢的关键因素之一。企业信息化所需的 IT 技术越来越多、越来越复杂,而更重要的是 A 公司必要的 IT 需求,却不见得 B 公司也需要。因此,在这种趋势演变下,事先规划与确认符合企业经营策略的 IT 需求,是新一代的企业信息部门所必须负责的关键任务之一。 图一所示,以建模为导向的企业 IT 建设参考流...
阅读全文
摘要: 巴科斯范式及其扩展BNF & Augmented BNF 什么是巴科斯范式? 巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。 现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。 巴科斯范式的内容 在双引号中的字("word")代表着这些字符...
阅读全文
摘要: 好久没有写日志了。最近在忙什么呢?忙的很高兴,呵呵~校内网的玫瑰收获了有人可以送,人生变的有意义多了。。速度慢没关系,但不能等于0,买了书就要看完,To-do list里面写了老长的要做的事,该抽出时间来做了。加油!觉得累的时候,就想想写在沙滩上字吧~
阅读全文