2021SC@SDUSC
目录
一.引言
SDU信息门户系统中使用了groovy文件,这篇博客主要是结合代码解析groovy文件。Apache Groovy是一个功能强大的动态编程语言,靠着其简洁、与Java非常相似以及易于学习的语法,它支持DSL,提供运行阶段和编译阶段元数据编程等强大的功能。Groovy语言兼静态语言和动态语言的特征,同时借鉴了很多语言快速开发的能力。
二.代码解析
1.groovy文件I/O
File类用于实例化以文件名作为参数的新对象。 然后它接受eachLine的函数,将它放到一个line的变量并相应地打印它。
import java.io.File
class Example {
static void main(String[] args) {
new File("E:/student.txt").eachLine {
line -> println "line : $line";
}
}
}
2.xml处理
解析字符串,获得XmlSlurper对象(new 方式),获得节点对象(parseXXX(xmlString)方法的返回值),通过节点对象获得节点值、节点属性值
String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<value>\n" +
" <books id=\"1\" type=\"android\">\n" +
" <book page=\"507\">\n" +
"
" </book>\n" +
" <book page=\"507\">\n" +
"
" </book>\n" +
" <book page=\"100\">\n" +
"
" </book>\n" +
" </books>\n" +
"\n" +
"</value>"
def xmlSlurper = new XmlSlurper()
核心类MarkupBuilder
1、先生成根节点,调用方法即可(方法名为根节点名)
2、节点套节点就是,闭包里面吊方法
3、节点的属性、属性值就使用键值对即可
4、节点的值直接使用值即可。
//xml 的生成
//public class StringWriter extends Writer
def sw = new StringWriter() // 生成的xml写入文件
def xmlBuilder = new MarkupBuilder(sw) // 生成xml的核心类
xmlBuilder.LolPersons(id:"1"){
yasuo(type:")
gailun(type:"")
}
println(sw)
----------------------------------------
log:
<LolPersons id='1'>
<yasuo</yasuo>
<gailun type='' desc='></gailun>
</LolPersons>
3.swing构建器
Groovy有可以用来创建标准对象和结构的构建器。 groovy中可用的不同构建器。在groovy中,还可以使用groovy中提供的swing构建器创建图形用户界面。swing组件的主要类是Swing Builder类。导入groovy.swing.SwingBuilde类。类型对于变量,属性,方法,闭包的参数以及方法的返回类型都是可有可无的,都是在给变量赋值的时候才决定它的类型, 不同的类型会在后面用到,任何类型都可以被使用,即使是基本类型 (通过自动包装(autoboxing)). 当需要时,很多类型之间的转换都会自动发生,比如在这些类型之间的转换: 字符串(String),基本类型(如int) 和类型的包装类 之间,可以把不同的基本类型添加到同一数组(collections)中。
import groovy.swing.SwingBuilder
import javax.swing.*
// Create a builder
def myapp = new SwingBuilder()
// Compose the builder
def myframe = myapp.frame(title : 'Tutorials Point', location : [200, 200],
size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE {
label(text : )
}
// The following statement is used for displaying the form
frame.setVisible(true)
4.异常处理
如果文件(file.txt)不在E盘中,那么将引发以下异常。扩展RuntimeException的类称为未检查异常,例如,ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException等。未检查的异常在编译期不检查,而是在运行时检查。典型的情况是ArrayIndexOutOf Bounds Exception,当您尝试访问大于数组长度的数组的索引时,会发生这种情况。
class student {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
}catch(ArrayIndexOutOfBoundsException ex) {
println("Catching the Array out of Bounds exception");
}catch(Exception ex) {
println("Catching the exception");
}
println("Let's move on after the exception");
}
}
5.实现接口
SDU信息门户系统处理的事件在一个事件列表events中. 列表是动态的;这些不同的事件的事件处理程序在变量handler所引用的代码块中. 循环 events中的每个事件,使用 asType( ) 方法创建每个接口的实现.在代码块上调用此方法 并使用 forName( )方法获得接口的Class metaobject作为参数.上面的代码, 在代码块上使用asType( ) 方法. 假如你不同的方法有不同的实现, 可以使用Map代替单一的代码块. 这样的话, 你可以用简单的方式在Map上调用asType( )方法 .
frame = new JFrame(size:[300,300],layout:new FlowLayout(), defaultCloseOperation:javax.swing.WindowConstants.EXIT_ON_CLOSE)
frame.setVisible(true)
button = new Button("click")
positionLabel = new JLabel("")
msgLabel = new JLabel("")
frame.contentPane.add button
frame.contentPane.add positionLabel
frame.contentPane.add msgLabel
button.addActionListener(
{JOptionPane.showMessageDialog(frame,"You clicked!")} as ActionListener
)
displayMouseLocation = { positionLabel.setText("$it.x, $it.y" ) }
frame.addMouseListener(displayMouseLocation as MouseListener)
frame.addMouseMotionListener(displayMouseLocation as MouseMotionListener)
handleFocus = [
focusGained : { msgLabel.setText("Good to see you!" ) },
focusLost : { msgLabel.setText("Come back soon!" ) }
]
button.addFocusListener(handleFocus as FocusListener)
events = ['WindowListener' , 'ComponentListener' ]
// Above list may be dynamic and may come from some input
handler = { msgLabel.setText("$it" ) }
for (event in events)
{
handlerImpl = handler.asType(Class.forName("java.awt.event.${event}" ))
frame."add${event}" (handlerImpl)
}
frame.show()
6 .解析和生成JSON对象
JsonParserCharArray解析器基本上采用一个JSON字符串并对底层字符数组进行操作。在值转换期间,它复制字符子数组(称为“斩波”的机制)并单独操作它们。JsonFastParser是JsonParserCharArray的一个特殊变体。在解析给定的JSON字符串期间,它尽可能努力地避免创建新的字符数组或String实例。它只保留指向底层原始字符数组的指针。此外,它会尽可能晚地推迟对象创建。JsonParserUsingCharacterSource是一个非常大的文件的特殊解析器。获取对象时,您可以看到我们实际上可以通过键访问JSON字符串中的值。
NEWLINE = System.getProperty("line.separator")
INDENT = " "
def printJSON(level, col, o) {
switch (o) {
case null: OUT.append("null"); break
case Tuple: printJSON(level, o[0], o[1]); break
case Map:
OUT.append("{")
o.entrySet().eachWithIndex { entry, i ->
OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}")
OUT.append("\"${escapeStr(entry.getKey().toString())}\"")
OUT.append(": ")
printJSON(level + 1, col, entry.getValue())
}
OUT.append("$NEWLINE${INDENT * level}}")
break
case Object[]:
case Iterable:
OUT.append("[")
def plain = true
o.eachWithIndex { item, i ->
plain = item == null || item instanceof Number || item instanceof Boolean || item instanceof String
if (plain) {
OUT.append(i > 0 ? ", " : "")
}
else {
OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}")
}
printJSON(level + 1, col, item)
}
if (plain) OUT.append("]") else OUT.append("$NEWLINE${INDENT * level}]")
break
case Boolean: OUT.append("$o"); break
default:
def str = FORMATTER.formatValue(o, col)
OUT.append(FORMATTER.isStringLiteral(o, col) ? "\"${escapeStr(str)}\"" : str);
break
}
}
printJSON(0, null, ROWS.transform { row ->
def map = new LinkedHashMap<String, String>()
COLUMNS.each { col ->
if (row.hasValue(col)) {
def val = row.value(col)
map.put(col.name(), new Tuple(col, val))
}
}
map
})
三.总结
通过这次的学习,我初步了解了一部分Groovy的知识,Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似。它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。 Java作为一种通用、静态类型的编译型语。SDU信息门户中多数的groovy文件是为了解析和生成JSON文件。