`
ezzze
  • 浏览: 41337 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【Meta Programming】折腾了半天 就折腾出来这么点东西

阅读更多
一段运行时修改方法的代码......

groovy的meta programming 果然强大..... 好吧 其实是我见识少.....

早就想写一段javascript prototype代码风格的groovy代码了.....

于是折腾了半天就折腾出来这么样的东东.....
class MetaTest{
	def propertyMissing(String name){
		return Proxy(name);
	}
	
	def Proxy(String name){
		println "entering proxy"
		def clazz = Class.forName(name);
		def klazz = clazz.newInstance();
		klazz.metaClass.methods.findAll { it.name == "getTest" }.each {
			op->
			println "entering in method"
			klazz.metaClass."${op.name}" << { String a ->
				a = "call up"
				return a;
			}
		}
		return klazz;
	}
	

	public static void main(String[] args){
		MetaTest t = new MetaTest();
		println (t.MetaFuck.getTest("absc"));
	
	}

}




class MetaFuck {
	
    static public String getTest(String arg){
		return arg;
	}
	
}

分享到:
评论
2 楼 ezzze 2011-05-23  
JohnnyJian 写道
什么叫prototype风格?metaclass本身不是就是prototype风格吗?

groovy:
t.metaClass.getTest = { arg -> arg }
assert t.getText('abc') == 'abc'


javascript:
t.prototype.getTest = function(arg) { return arg };
assert(t.getText('abc') == 'abc')


没错, 我只是分享我的一个使用场景,需要动态的修改某个运行时时才知道的类的方法....、

我也没说只有我下面的代码才是prototype风格的 是吧....

1 楼 JohnnyJian 2011-05-20  
什么叫prototype风格?metaclass本身不是就是prototype风格吗?

groovy:
t.metaClass.getTest = { arg -> arg }
assert t.getText('abc') == 'abc'


javascript:
t.prototype.getTest = function(arg) { return arg };
assert(t.getText('abc') == 'abc')

相关推荐

Global site tag (gtag.js) - Google Analytics