GroovyShell的初始化过程

GroovyShell的初始化

    public GroovyShell(CompilerConfiguration config) {
        this(new Binding(), config);
    }

	class Binding is subclass of GroovyObjectSupport

	public GroovyObjectSupport() {
        this.metaClass = InvokerHelper.getMetaClass(this.getClass());
    }

	while the InvokerHelper has static members 

	public static final MetaClassRegistry metaRegistry = GroovySystem.getMetaClassRegistry();

	So the GroovySystem will be loaded, and its static members

	static {
        USE_REFLECTION = true;
        META_CLASS_REGISTRY = new MetaClassRegistryImpl();
    }

	public MetaClassRegistryImpl() {
        this(LOAD_DEFAULT, true);
    }

	it will call MetaClassRegistryImpl.registerMethods,
	-> GeneratedMetaMethod.DgmMethodRecord.loadDgmInfo();
	the function will analysis groovy-2.4.0.jar$META-INF/dgminfo
	这是一个二进制流的文件,她定义了很多基本的函数的参数个数,类型,返回值的类型等等
	这个函数最后返回一个列表,记录了所欧的基本函数

	registerMethods(null, true, true, map);返回后, map是一个CachedClass为key (如java.util.Calendar)
		list<MetaMethod>  为value的map 如[[email protected][name: clearTime params: [] returns: class java.util.Calendar owner: class java.util.Calendar],..]

	接着和DefaultGroovyMethods.additionals 合并, 不断填充map
	接着和class org.codehaus.groovy.vmplugin.v5.PluginDefaultGroovyMethods 合并 (所有函数为 [
	public static java.lang.StringBuilder org.codehaus.groovy.vmplugin.v5.PluginDefaultGroovyMethods.leftShift(java.lang.StringBuilder,java.lang.Object), public static java.lang.Object org.codehaus.groovy.vmplugin.v5.PluginDefaultGroovyMethods.next(java.lang.Enum),
	public static java.lang.String org.codehaus.groovy.vmplugin.v5.PluginDefaultGroovyMethods.plus(java.lang.StringBuilder,java.lang.String), public static java.lang.Object org.codehaus.groovy.vmplugin.v5.PluginDefaultGroovyMethods.previous(java.lang.Enum),
	public static void org.codehaus.groovy.vmplugin.v5.PluginDefaultGroovyMethods.putAt(java.lang.StringBuilder,groovy.lang.EmptyRange,java.lang.Object), public static void org.codehaus.groovy.vmplugin.v5.PluginDefaultGroovyMethods.putAt(java.lang.StringBuilder,groovy.lang.IntRange,java.lang.Object), public static int org.codehaus.groovy.vmplugin.v5.PluginDefaultGroovyMethods.size(java.lang.StringBuilder)])

	注意leftShift

	接着DefaultGroovyStaticMethods
	接着     ExtensionModuleScanner scanner = new ExtensionModuleScanner(new DefaultModuleListener(map), this.getClass().getClassLoader());
            scanner.scanClasspathModules();
			从所有META-INF/services/org.codehaus.groovy.runtime.ExtensionModule 中找出properties,
			处理   ---------具体略以后分析
			从 groovy-jsr223-<version>.jar中,找出
			[public static java.lang.Object org.codehaus.groovy.jsr223.ScriptExtensions.eval(javax.script.ScriptEngine,java.io.Reader,groovy.lang.Binding) throws javax.script.ScriptException, public static java.lang.Object org.codehaus.groovy.jsr223.ScriptExtensions.eval(javax.script.ScriptEngine,java.lang.String,groovy.lang.Binding) throws javax.script.ScriptException, public static javax.script.ScriptEngine org.codehaus.groovy.jsr223.ScriptStaticExtensions.$static_propertyMissing(javax.script.ScriptEngineManager,java.lang.String)]

	以上过程也在同时不断写MetaClassRegistryImpl类的
	private FastArray instanceMethods = new FastArray();
    private FastArray staticMethods = new FastArray();
	

时间: 2024-10-27 00:09:31

GroovyShell的初始化过程的相关文章

java代码的初始化过程研究

刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻--)但是博主写的不够详细具体,我想在这详细谈一下java代码的具体初始化过程. 首先要清楚,初始化分为两个过程:类初始化.对象初始化. 类初始化是指类加载器将类加载到内存时,对类成员的初始化过程,也就是有static修饰的变量.对于加载完的类,它的类变量都会赋一个默认值,即使你定义时就赋值了.比如int类型就是0

JAVA对象的初始化过程

出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1:   编译并运行该程序会有以下输出 Static Block Employee Company:china soft Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() 下面我们来对结果做分析: 1 在代码34行实例化对象时, 先对给

Java对象相关元素的初始化过程

1.类的成员变量.构造函数.成员方法的初始化过程 当一个类使用new关键字来创建新的对象的时候,比如Person per = new Person();JVM根据Person()寻找匹配的类,然后找到这个类相匹配的构造方法,这里是无参构造,如果程序中没有给出任何构造方法,则JVM默认会给出一个无参构造.当创建一个对象的时候一定对调用该类的构造方法,构造方法就是为了对对象的数据进行初始化.JVM会对给这个对象分配内存空间,也就是对类的成员变量进行分配内存空间,如果类中在定义成员变量就赋值的话,就按

对Socket CAN的理解(5)——【Socket CAN控制器的初始化过程】

转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 对于一般的CAN模块,进行初始化时,最关键的是以下两步: 1.  配置CAN的位时序: 2.  配置CAN的消息报文: 下面,我们来详细分析上面提到的关键两步. 一.初始化步骤: 1.  第一步,进入初始化模式,在CAN控制寄存器中,将Init位置1: 2.  第二步,在CAN控制寄存器中,将CCE位置1: 3.  第三步,等待Init位置1,此步聚为了确保已经进入初始化模式: 4.  第四步,将位时序的值写入到

IOC容器的初始化过程

1.ClassPathXmlApplicationContext类体系结构 左边的黄色部分是ApplicationContext体系继承结构,右边是BeanFactory结构体系,两个体系是典型的模板方法设计模式的使用. 从该继承体系可以看出: (1)BeanFactory是一个bean工厂的最基本定义,里面包含了一个bean工厂的几个最基本方法:getBean(),containsBean()等,是一个很纯粹的bean工厂,不关注资源.资源位置.事件等. ApplicationContext是

Java初始化过程

以下程序执行的结果是: class X{ Y y=new Y(); public X(){ System.out.print("X"); } } class Y{ public Y(){ System.out.print("Y"); } } public class Z extends X{ Y y=new Y(); public Z(){ System.out.print("Z"); } public static void main(Stri

启动期间的内存管理之初始化过程概述----Linux内存管理(九)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的boot阶段就是系统初始化阶段使用的内存分配器. 1 前景回顾 1.1

继承的初始化过程

看think in java 7.9.1继承的初始化过程的例子,并没有讲到static 代码块的初始化顺序 类在初次使用的时候才会被加载,static代码会在加载的时候初始化,所以一个类按照先加载static变量—>static 代码块->普通变量->构造器代码 的顺序进行初始化 而出现继承的时候,类的初始化顺序如下 1.父类的static 变量 2.父类的static 代码块 3.子类的static 变量 4.子类的static 代码块 5.父类的变量 6 父类的构造器 7 子类的变量

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行. | 实例变量  及非static模块---> 按照代码顺序依次执行. | 构造函数 ---> 执行对应的构造函数. 子类的初始化过程. 父类static修饰的模块 | 子类static修饰模块 | 父类实例变量和非static块 | 父