基于JVM的动态语言Groovy MetaProgramming 知识集

简介: Metaprogramming 使groovy动态语言的特性发挥的淋漓尽致(Metaprogramming is writing code that has the ability to dynamicallychange its behavior at runtime.

Metaprogramming 使groovy动态语言的特性发挥的淋漓尽致(Metaprogramming is writing code that has the ability to dynamicallychange its behavior at runtime.)

如下是这方面的知识一个汇总

1. 类Discovering the Class

def s = "Hello"

printlns.class

printlns.getClass()

String.constructors.each{println it}

println ""

String.interfaces.each{println it}

println ""

2. 域Discovering the Fields of a Class

def d = new Date()

printlnd.properties

println ""

d.properties.each{println it}

println ""

d.class.declaredFields.each{println it}

println ""

//重要的对象metaClass

printlnDate.metaClass

3. 域存在性检查Checking for the Existence of a Field

class Person{

String firstname

String lastname

String toString(){"${firstname} ${lastname}"}

MetaPropertyhasProperty(String property){

return this.metaClass.hasProperty(this, property)

}

}

def person = new Person()

def request = [firstname: "bill", lastname: "gates"]

request.each{name, value->

if(person.metaClass.hasProperty(person, name)){

//if(person.hasProperty(name)){

person.setProperty(name, value)

}

}

println person

4. 方法Discovering the Methods of a Class

def d = new Date()

d.class.methods.each{println it}

d.class.methods.name

println ""

//evaluate run in a new shell

d.class.methods.each{method ->

if(method.name.startsWith("get")){

print "${method.name}: "

evaluate("dd = new Date(); println dd.${method.name}()")

}

}

println ""

//

def binding = new Binding()

binding.setVariable("d", d)

defgs = new GroovyShell(binding)

d.class.methods.each{method ->

if(method.name.startsWith("get")){

print "${method.name}: "

gs.evaluate("println d.${method.name}()")

}

}

println ""

//GString (most concise way to dynamically call a method on a class)

d.class.methods.each{method ->

if(method.name.startsWith("get")){

print "${method.name}: "

println d."${method.name}"()

}

}

println ""

5. 方法存在性检查Checking for the Existence of a Method

class Greeting{

defsayHello(){

println "Hello, Stranger"

}

defsayHello(String name){

println "Hello, ${name}"

}

}

def g = new Greeting()

if(g.metaClass.respondsTo(g, "sayHello", null)){

g.sayHello()

}

if(g.metaClass.respondsTo(g, "sayHello", String)){

g.sayHello("Jane")

}

println "Number of sayHello() methods: " + g.metaClass.respondsTo(g, "sayHello").size()

g.metaClass.respondsTo(g, "sayHello").each{m ->

println "${m.name} ${m.nativeParameterTypes}"

}

6. 域指针Creating a Field Pointer

def p = new Person()

p.name = "Jane"

println p.name

//Field Pointer, 可以操作privtate

printlnp.@name

7. 方法指针Creating a Method Pointer

def list = []

def insert = list.&add

insert "Java"

insert "Groovy"

println list

8. Calling Methods That Don’t Exist (invokeMethod)

class Person{

String name

Map relationships = [:]

Object invokeMethod(String what, Object who){

if(relationships.containsKey(what)){

who.each{thisPerson ->

relationships.get(what).add(thisPerson)

}

}

else{

relationships.put(what,who as List)

}

}

}

defscott = new Person(name:"Scott")

scott.married "Kim"

scott.knows "Neal"

scott.workedWith "Brian"

scott.knows "Venkat"

scott.workedWith "Jared"

scott.knows "Ted", "Ben", "David"

printlnscott.relationships

9. Creating an Expando

def e = new Expando()

e.latitude = 70

e.longitude = 30

println e

e.areWeLost = {->

return (e.longitude != 30) || (e.latitude != 70)

}

printlne.areWeLost()

10. Adding Methods to a Class Dynamically (Categories)

Categories allow you to add new functionality to any class at runtime.

use(RandomHelper){

10.times{ println 10.rand() }

}

class RandomHelper{

static int rand(Integer self){

def r = new Random()

return r.nextInt(self.intValue())

}

}

use(InternetUtils){

println "http://localhost/".get()

println "http://search.yahoo.com/search".get("p=groovy")

defparams = [:]

params.n = "10"

params.vl = "lang_eng"

params.p = "groovy"

println "http://search.yahoo.com/search".get(params)

}

class InternetUtils{

static String get(String self){

return self.toURL().text

}

static String get(String self, String queryString){

defurl = self + "?" + queryString

return url.get()

}

static String get(String self, Map params){

def list = []

params.each{k,v->

list << "$k=" + URLEncoder.encode(v)

}

defurl = self + "?" + list.join("&")

return url.get()

}

}

11. Adding Methods to a Class Dynamically(ExpandoMetaClass)

Integer.metaClass.rand = {->

def r = new Random()

return r.nextInt(delegate.intValue())

}

5.times{ println 10.rand() }

String.metaClass.get = {->

return delegate.toURL().text

}

println "http://localhost/".get()

 

A category is perfect ifyou want to limit the scope of your new methods to a well-defined blockof code. An ExpandoMetaClass is better if you want to have your newmethods applied to all instances across the entire running application.

If you want your new functionality to be easily shared by both Java andGroovy code, categories leave you with a plain old Java class with staticmethods. ExpandoMetaClasses are more closely tied to Groovy, but theyare significantly more performant as well.

以上可以作为使用的一个参考,在使用反射等这类应用时,使用groovy可以很大的简化开发

相关文章
|
Java 关系型数据库 数据库连接
基于JVM的动态语言Groovy 基础知识汇总
在使用Java的过程中,和C#的语法相比有些还是比较麻烦,比如异常、get set等问题,毕竟Java的发展时间比C#长了很多,很多问题当初设计时没有考虑到,为了向前兼容,不得不保留一定的历史负担(如泛型的处理,java的擦除法实现就是后续的兼容考虑)。
1190 0
|
1月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
37 4
|
3月前
|
Java Docker 索引
记录一次索引未建立、继而引发一系列的问题、包含索引创建失败、虚拟机中JVM虚拟机内存满的情况
这篇文章记录了作者在分布式微服务项目中遇到的一系列问题,起因是商品服务检索接口测试失败,原因是Elasticsearch索引未找到。文章详细描述了解决过程中遇到的几个关键问题:分词器的安装、Elasticsearch内存溢出的处理,以及最终成功创建`gulimall_product`索引的步骤。作者还分享了使用Postman测试接口的经历,并强调了问题解决过程中遇到的挑战和所花费的时间。
|
11天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
9天前
|
Java Linux Windows
JVM内存
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
10 1
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
65 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
存储 缓存 算法
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
|
28天前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
46 10
|
27天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
1月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
51 2

相关课程

更多
下一篇
无影云桌面