1. 第一种拦截方式
class Person{
def name
def dream(){
println 'i have a dream'
}
}
def p = new Person(name:'Zeking')
p.dream()
p.invokeMethod('dream',null)
MetaMethod m = p.metaClass.getMetaMethod('dream',null)
m.invoke(p,null)
println '========================================================'
class Person2 implements GroovyInterceptable{
def name
def dream(){
println 'p2 i have a dream'
}
Object invokeMethod(String name, Object args){
System.out.println 'p2 invoke'
}
}
def p2 = new Person2(name:'Zeking')
p2.dream()
p2.dream1()
println '========================================================'
class Person3 implements GroovyInterceptable{
def name
def dream(){
System.out.println 'p3 i have a dream'
}
Object invokeMethod(String name, Object args){
System.out.println 'p3 invoke'
if (metaClass.invokeMethod(this,'respondsTo',name,args)){
}
}
}
def p3 = new Person3(name:'Zeking')
p3.invokeMethod('dream',null)
p3.metaClass.invokeMethod(p3,'dream',null)
p3.dream()
println '========================================================'
class Person4 implements GroovyInterceptable{
def name
def dream(){
System.out.println 'p4 i have a dream'
}
Object invokeMethod(String name, Object args){
System.out.println 'p4 invoke'
if (metaClass.invokeMethod(this,'respondsTo',name,args)){
metaClass.invokeMethod(this,name,null)
}else {
System.out.println 'p4 missing method'
}
}
}
def p4 = new Person4(name:'Zeking')
p4.dream()
println '========================================================'
class Manager {
static Manager instance
def isInit
static Manager getInstance(){
if (null == instance){
synchronized (Manager.class){
if (null == instance){
instance = new Manager()
}
}
}
return instance
}
def init(){
isInit = true
}
def dream(){
if (isInit){
System.out.println 'm5 i have a dream'
}
}
}
class Manager2 implements GroovyInterceptable{
static Manager2 instance
def isInit
static Manager2 getInstance(){
if (null == instance){
synchronized (Manager2.class){
if (null == instance){
instance = new Manager2()
}
}
}
return instance
}
def init(){
isInit = true
}
def dream(){
if (isInit){
System.out.println 'm5 i have a dream'
}
}
Object invokeMethod(String name, Object args){
System.out.println 'm2 invoke'
if (name != 'init'){
if(!isInit){
System.out.println 'please invoke init first'
return
}
}
if (metaClass.invokeMethod(this,'respondsTo',name,args)){
metaClass.invokeMethod(this,name,null)
}else {
System.out.println 'p4 missing method'
}
}
}
Manager2.instance.dream()
Manager2.instance.init()
Manager2.instance.dream()
2. 第二种拦截方式
println '==============1.1================================='
class Zeking{
def dream(){
println "Zekign's dream"
}
}
def zeking = new Zeking()
zeking.dream()
zeking.metaClass.dream = {
println 'replace dream'
}
zeking.dream()
new Zeking().dream()
println '==============1.2================================='
class Zeking2{
def dream(){
println "2 : Zekign's dream"
}
}
def zeking2 = new Zeking2()
zeking2.metaClass.dream = {
println '2 : replace dream'
}
zeking2.metaClass.invokeMethod = {
String name, Object args->
System.out.println('2 : invoke')
}
zeking2.dream()
println '=============1.3=================================='
class Zeking3{
def dream(){
println "3 : Zekign's dream"
}
}
def zeking3 = new Zeking3()
zeking3.metaClass.dream = {
println '3 : replace dream'
}
zeking3.metaClass.invokeMethod = {
String name, Object args->
System.out.println('3 : invoke')
def method = delegate.metaClass.getMetaMethod(name,args)
if (method){
method.invoke(delegate,args)
}
}
zeking3.dream()
println '=================1.4=============================='
String.metaClass.plus = {
CharSequence i ->
i
}
println "123"+'abc'
println '==============2.1================================='
class Zeking10{
def dream(){
println "10 : Zekign's dream"
}
}
def zeking10 = new Zeking10()
zeking10.dream()
Zeking10.metaClass.dream = {
println '10 : replace dream'
}
zeking10.dream()
new Zeking10().dream()
3. propertyMissing methodMissing
class Man{
def propertyMissing(String name) {
return null
}
def propertyMissing(String name, def arg) {
}
def methodMissing(String name, def args) {
println 'methodMissing'
return 'dream'
}
}
def man = new Man()
man.dream()
println man.dream()
4. 模拟 命令行输入,动态改变方法
class Man2{
def dream(){
println 'Man2 dream()'
}
def propertyMissing(String name) {
return null
}
def propertyMissing(String name, def arg) {
}
def methodMissing(String name, def args) {
println 'methodMissing'
return 'dream'
}
}
def man2 = new Man2()
def scanner = new Scanner(System.in)
Thread.start {
while (true){
def msg = scanner.nextLine()
if (msg == 'exit'){
break
}
if (man2.respondsTo(msg)){
man2."$msg"()
}else {
def (name,body) = msg.split(":")
man2.metaClass."$name" = {
evaluate(body)
}
}
}
}
