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 区别 | 闭包中调用对象中的方法 )
GroovyGroovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )
GroovyGroovy 脚本调用 ( Java 类中调用 Groovy 脚本 )
GroovyGroovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )