Groovy06_Groovy方法扩展与脚本调用

Posted 李樟清

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Groovy06_Groovy方法扩展与脚本调用相关的知识,希望对你有一定的参考价值。

1. Groovy方法扩展

1. 用Socket 来引出今天的内容

server.groovy



//线程 流
def server = new ServerSocket(9999)

def isRunning = true

def sockets = []

def close(socket) 
    if (null != socket) 
        if (!socket.isClosed()) 
            socket.close()
        
    


//InputStream is
//is.text
//
//
//sockets.each 

Thread.start 
    println("开启服务器")
    while (isRunning) 
        try 
            def socket = server.accept()
            sockets << socket
            println("新的连接:$socket.remoteSocketAddress")
            Thread.start 
                //读取内容
                while (!socket.isClosed()) 
                    try 
                        def buffer = new byte[2048]
                        def len = socket.inputStream.read(buffer)
                        if (len > 0)
                            println "[$socket.remoteSocketAddress]:$new String(buffer, 0, len)"
                     catch (ex) 
                        println "异常:$ex.getLocalizedMessage()"
                    
                
                sockets.remove(socket)
                println("断开连接:$socket.remoteSocketAddress")
            
         catch (ex) 
            println "异常:$ex.getLocalizedMessage()"
        
    
    println("关闭服务器")
    close(server)
    sockets.each 
        close(it)
    

def scanner = new Scanner(System.in)

Thread.start 
    while (isRunning) 
        def msg = scanner.nextLine()
        if (msg == 'exit') 
            isRunning = false
            close(server)
            sockets.each 
                close(it)
            
            break
        
        sockets*.outputStream*.write(msg.getBytes())
    

client.grovvy




def client = new Socket('localhost', 9999)

Thread.start 
    while (!client.isClosed()) 
        try 
            def buffer = new byte[2048]
            def len = client.inputStream.read(buffer)
            if (len > 0)
                println "[$client.remoteSocketAddress]:$new String(buffer, 0, len)"
         catch (ex) 
            println "异常:$ex.getLocalizedMessage()"
        
    


def scanner = new Scanner(System.in)

Thread.start 
    while (!client.isClosed()) 
        def msg = scanner.nextLine()
        if (msg == 'exit') 
            isRunning = false
            client.close()
            break
        
        client.outputStream.write(msg.getBytes())
    

为什么 Thread.start?

2. Groovy方法扩展

FileExtension.grovvy

class FileExtension 
    //org.codehaus.groovy.runtime.ExtensionModule
    static File start(File self, Closure closure) 
        closure()
        return self
    

包名必须为manifest.META-INF.services
文件名必须为org.codehaus.groovy.runtime.ExtensionModule

moduleName=myFile
moduleVersion=1.0
staticExtensionClasses=FileExtension

lsn6.groovy

File file = new File('D:\\\\Nodes\\\\Gradle\\\\Lsn_06\\\\1.txt')

file.start
    println 'start'

然后使用命令

groovyc -d classes FileExtension.groovy

jar -cf file.jar -C classes . -C manifest/ .

再使用groovy -classpath file.jar lsn6.groovy

会输出start

3. 另外一些扩展方法的办法:MOP语言编程

2. 脚本调用

1. 用发送邮件来引出今天的内容

配置文件emial.groovy

mail
    smtp
        auth = true
        host = 'smtp.163.com'
        prot = 25
    

    env
        name = 'mybody26@163.com'
        pwd = 'lzq123456'
        toList = '396298154@qq.com'
    

script.groovy

#!/usr/bin/env groovy -classpath javax.mail.jar        //linux 这样写  然后直接 在命令行./ emial.groovy
import javax.mail.Authenticator
import javax.mail.Message
import javax.mail.PasswordAuthentication
import javax.mail.Session
import javax.mail.Transport
import javax.mail.internet.MimeMessage

// 运行在服务器上 给所有相关人员发送邮件

// 可以看成一个map
//args = []
//args[0] = 'emial.groovy'
def config = new ConfigSlurper().parse(new File(args[0]).toURI().toURL())

//println  config.mail.smtp.host  // smtp.163.com

// 邮箱会话
def session = Session.getDefaultInstance(config.toProperties(),new Authenticator() 
    @Override
    protected PasswordAuthentication getPasswordAuthentication() 
//        return super.getPasswordAuthentication()
        return new PasswordAuthentication(config.mail.env.name,config.mail.env.pwd)
    
)
session.setDebug(true)
// 邮件
def msg = new MimeMessage(session)
// 设置发件人
msg.setFrom(config.mail.env.name)
// 设置收件人
msg.setRecipients(Message.RecipientType.TO,config.mail.env.toList)

// 设置主题
msg.setSubject('ip notify')
// 设置正文
def address = InetAddress.localHost
msg.setText(address.hostName +" ip change: " + address.hostAddress)
// 发送
//Transport.send(msg)

// Linux 运行一个脚本       ./shell.sh aa a
// groovy 也能这样做,但是 linux和window 有区别
// linux 看最上面
// window :groovy -classpath javax.mail.jar script.groovy emial.groovy

上面就是 发送邮件的例子

2. 脚本调用脚本 和 groovy类调用脚本

lsn6_1_0.groovy

// 本地作用域  (相当于私有)
def name = '123'
// 绑定作用域 (相当于公有)
pwd = '456'

println binding.variables   // [args:[], pwd:456]

// 这样是都可以打印的
println name    //123
println pwd     // 456

void func()
    println pwd         //456
    println name        // groovy.lang.MissingPropertyException: No such property: name for class: lsn6_1_0


//func()

// 如何进行脚本调用脚本?
// 因为我们的脚本是继承Script类,Script类里面有一个evaluate 方法
//args = []
//args[0] = 'emial.groovy'
//evaluate(new File('script.groovy'))
// 为什么? 因为evaluate 的实现源码GroovyShell shell = new GroovyShell(getClass().getClassLoader(), binding);
// 他吧 binding 传递进去了 ,binding就是保存所有绑定作用域的变量的

// 如何在groovy类调用脚本?
class Test
    static void main(args)
        def binding = new Binding()
        binding.setVariable('args',['src/main/groovy/emial.groovy'])
        GroovyShell shell = new GroovyShell(getClass().getClassLoader(), binding)
        shell.evaluate(new File('src/main/groovy/script.groovy'))
    

3. java类调用脚本

import groovy.lang.Binding;
import groovy.lang.GroovyShell;

import java.io.File;
import java.io.IOException;

public class lsn6_java 

    public static void main(String[] args) throws IOException 
        Binding binding = new Binding();
        binding.setVariable("args",new String[]"src/main/groovy/emial.groovy");
        GroovyShell shell = new GroovyShell(binding);
        shell.evaluate(new File("src/main/groovy/script.groovy"));

        Person person = new Zeking();
        person.dream("111");  // person object:111
    

3. 注意 java 和 groovy使用的一点

lsn6_1_1.groovy

class Person
    def dream(Object object)
        println "person object:" + object
    


class Zeking extends Person
    def dream(String str)
        println "Zeking str:" + str
    


Person person = new Zeking()
person.dream('111')     // Zeking str:111
public class lsn6_java 

    public static void main(String[] args) throws IOException 
        Person person = new Zeking();
        person.dream("111");  // person object:111
    

以上是关于Groovy06_Groovy方法扩展与脚本调用的主要内容,如果未能解决你的问题,请参考以下文章

GroovyGroovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )

Groovy闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

Groovy05_Groovy方法调用与运算符重载

GroovyGroovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )

GroovyGroovy 脚本调用 ( Java 类中调用 Groovy 脚本 )

GroovyGroovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )