Groovyの学習記録05

1つ、抽象的な

package study.object.extend

/**
 * 继承:abstract抽象类关键字
 */
abstract class AbstractPerson {
    
    
    protected String name
    protected int age

    abstract void play()
}
package study.object.extend

class Man extends AbstractPerson {
    
    
    @Override
    void play() {
    
    
        println "我是继承类,$name,哈哈哈哇$age"
    }

    public static void main(String[] args) {
    
    
        Man man = new Man()
        man.name = "Groovy"
        man.age = 30
        man.play()//我是继承类,Groovy,哈哈哈哇30
    }
}

二、インターフェース

package study.object.inter
/**
 * 接口:
 * 一般修饰符不能存在方法体
 * default修饰时可以存在方法体
 */
interface Action {
    
    

    void play()

    default void eat(String name) {
    
    
        println "default 修饰类$name"
    }
}
package study.object.inter

/**
 * 当接口中存在用default修饰的方法时,该方法必须包含函数体
 * 如果存在类实现了该接口,此时接口将会丧失约束的作用。因为这个时候
 * 类不重写接口中未实现的方法也不会报编译器检查时错误,不过编译程序的时候
 * 仍旧会报错,说用户没有实现接口中未实现的方法
 */
class ActionImpl implements Action {
    
    

    @Override
    void play() {
    
    
        println "我是未实现方法"
    }

    public static void main(String[] args) {
    
    
        ActionImpl actionImpl = new ActionImpl()
        actionImpl.eat("大米") //default 修饰类大米
        actionImpl.play() //我是未实现方法
    }
}

3、特性

package study.object.trait
/**
 * 特征:Groovy相对于java的特殊用法
 * trait是一组可重用的方法和字段,可以将它们混入到一个或多个类中。一个类可以同时拥有多个trait而不需要使用多重继承(从而避免钻石问题)。
 * 方法不允许空实现
 */
trait Flags {
    
    
    String name

    void play() {
    
    
        println "trait Flags play $name"
    }

    /**
     * this关键字如下,study.object.trait.FlagsImpl
     * this代表当前Flags的实现类
     */
    void useThis() {
    
    
        println "this关键字如下,${this.class.name}"
    }

}
package study.object.trait

trait Flys {
    
    
    String name

    void fly() {
    
    
        println "$name 可以fly"
    }
}
package study.object.trait
/**
 * Flags的实现类
 */
class FlagsImpl implements Flags, Flys {
    
    
    public static void main(String[] args) {
    
    
        FlagsImpl flagsImpl = new FlagsImpl()
        flagsImpl.name = "Groovy"
        flagsImpl.play()//trait Flags play null  //null是因为trait Flys的name属性覆盖了trait Flags中的name
        flagsImpl.fly()//Groovy 可以fly
        flagsImpl.useThis()//this关键字如下,study.object.trait.FlagsImpl

    }
}

4、jsonおよびxmlの解析

package study.json_xml

import groovy.json.JsonOutput
import groovy.json.JsonSlurper

/**
 * Json解析
 */
class GroovyJsonGrammar {
    
    
    public static void main(String[] args) {
    
    
//        parseJson()
        outputJson()
    }

    private static void outputJson() {
    
    
        def list = [new Children(name: "xm", age: 18), new Children(name: "xh", age: 25)]
        def json = JsonOutput.toJson(list)
        println json//[{"age":18,"name":"xm"},{"age":25,"name":"xh"}]
        println json.class//class java.lang.String
        println JsonOutput.prettyPrint(json)  //格式化json
    }

    /**
     * 解析json
     */
    private static void parseJson() {
    
    
        def jsonSlurper = new JsonSlurper()
        def jsonData = jsonSlurper.parseText('{ "name": "Tony", "ID" : "12345"}')
        println "${jsonData.name}====${jsonData.ID}"//Tony====12345

        def object2 = jsonSlurper.parse('[{"name":"Tony","age":"123"},{"name":"Jack","age":"456"}]'.getBytes())
        println object2 //[[name:Tony, age:123], [name:Jack, age:456]]
        println object2[0] //[name:Tony, age:123]
        println object2[1].name//Jack
    }
}

package study.json_xml

import groovy.util.slurpersupport.GPathResult
import groovy.xml.MarkupBuilder
import groovy.xml.XmlUtil

class GroovyXmlGrammar {
    
    

    static void main(String[] args) {
    
    
//        productXml()
        parseXml()
    }


    /**
     * 解析xml
     */
    private static void parseXml() {
    
    
        String xml = '''
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.jvm_demo_20200601">
    <test>12345</test>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity2">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
'''
        def xmlSlurper = new XmlSlurper()
        def result = xmlSlurper.parseText(xml)
        //取属性值
        println result.@package  //com.example.jvm_demo_20200601
        //取结点下面的文本
        println result.test.text() //12345

        读取有域名空间的节点
        result.declareNamespace('android': 'http://schemas.android.com/apk/res/android')
        println result.application.@'android:allowBackup'  //true
        println result.application.activity[0].@'android:name' //.MainActivity
        println result.application.activity[1].@'android:name' //.MainActivity2

        //遍历xml节点
        result.application.activity.each {
    
    
            println it.@'android:name'
        }
    }

    /**
     * 生成Xml文件,这样编写就可以输出xml到控制台
     */
    private static void productXml() {
    
    
        def mB = new MarkupBuilder()

        /**
         * <collection shelf='New Arrivals'>
         *   <movie title='Enemy Behind' />
         *   <type>War, Thriller</type>
         *   <format>DVD</format>
         *   <year>2003</year>
         *   <rating>PG</rating>
         *   <stars>10</stars>
         *   <description>Talk about a US-Japan war</description>
         * </collection>
         */
        // Compose the builder
        mB.collection(shelf: 'New Arrivals') {
    
    
            movie(title: 'Enemy Behind')
            type('War, Thriller')
            format('DVD')
            year('2003')
            rating('PG')
            stars(10)
            description('Talk about a US-Japan war')
        }
    }
}

5、ファイル操作

package study

import groovy.io.FileType

/**
 * 文件操作
 */
class GroovyFileGrammar {
    
    

    public static void main(String[] args) {
    
    
//        println readFile02()
//        readFileByte("./GroovyStudy.iml")
//        testCurrentPathIsFile("G:/")
//        createFileDirectory("G:/yangminghan")
//        deleteFile("G:/yangminghan")
//        copyFile()
//        listFile("src/study")
        listEachFile("G:/MustSpace/001_GradleSpace/GroovyStudy")
    }

    /**
     * 读文件
     * @return
     */
    private static void readFile() {
    
    
        new File("./GroovyStudy.iml").eachLine {
    
    
            println(it)
        }
    }

    /**
     * 读文件
     * @return
     */
    private static void readFile01() {
    
    
        new File("./GroovyStudy.iml").eachLine {
    
    
            line -> println("line:${line}")
        }
    }

    /**
     * 读取文件的内容到字符串
     */
    private static String readFile02() {
    
    
        return new File("./GroovyStudy.iml").text
    }

    /**
     * 读取文件的大小
     */
    private static void readFileByte(String path) {
    
    
        println "文件位置为$path,文件大小是${new File(path).length()} bytes"
    }

    /**
     * 写文件
     */
    private static void writeFile() {
    
    
        new File("./a.txt").withWriter("utf-8") {
    
    
            it.writeLine "哇哈哈,哈哈哇"
        }
    }

    /**
     * 写文件
     */
    private static void writeFile01() {
    
    
        new File("./a.txt").withWriter("utf-8") {
    
    
            writer -> writer.writeLine '写文件1,写文件1,写文件1'
        }
    }

    /**
     * 测试是否是文件
     */
    private static void testCurrentPathIsFile(String path) {
    
    
        println "当前路径是否是文件,${new File(path).isFile()}" //false
        println "当前路径是否是文件,${new File(path).isDirectory()}"//true
    }

    /**
     * 创建文件夹
     */
    private static void createFileDirectory(String path) {
    
    
        def file = new File(path);
        def mkdir = file.mkdir()
        println "文件创建成功${mkdir}" //文件创建成功true
    }

    /**
     * 删除文件夹
     * @param path
     */
    private static void deleteFile(String path) {
    
    
        def delete = new File(path).delete()
        println "文件是否删除成功${delete}"
    }

    /**
     * 复制文件
     */
    private static copyFile() {
    
    
        def src = new File("./a.txt")
        def dest = new File("./b.txt")
        dest << src.text
    }

    /**
     * 获取目录下面的文件
     */
    private static listFile(String path) {
    
    
        new File(path).listFiles().each {
    
    
            println "当前文件夹路劲,${it.absolutePath}"
        }
    }

    /**
     * 递归显示目录及其子目录中的所有文件
     */
    private static listEachFile(String path) {
    
    
        new File(path).eachFileRecurse(FileType.DIRECTORIES) {
    
    
            println it.absolutePath
        }
    }
}



おすすめ

転載: blog.csdn.net/Duckdan/article/details/109330538