首页 > 其他 > 详细

Gradle源码入门学习之十-- Listener & Dispatch

时间:2015-02-15 21:50:55      阅读:354      评论:0      收藏:0      [点我收藏+]
new ListenerBroadcast<OutputEventListener>(OutputEventListener.class);
->
    public ListenerBroadcast(Class<T> type) {
        this.type = type;
        broadcast = new BroadcastDispatch<T>(type);
        source = new ProxyDispatchAdapter<T>(broadcast, type);
    }
->
	//broadcast的初始化:1 type  2. handlers
	public BroadcastDispatch(Class<T> type) {
        this.type = type;
    }
	
	//生成的broadcast,传给dispatch param
	public ProxyDispatchAdapter(Dispatch<? super MethodInvocation> dispatch, Class<T> type, Class<?>... extraTypes) {
        this.type = type;
		//传入的dispatch 是上面的 broadcast 变量,通过InvocationHandler的构造函数, 
		//在Invoke的时候,其实是broadcast在发消息,call dispatch函数.
        source = type.cast(Proxy.newProxyInstance(classLoader, types.toArray(new Class<?>[types.size()]),
                new DispatchingInvocationHandler(type, dispatch)));
    }
------------>	
	    private DispatchingInvocationHandler(Class<?> type, Dispatch<? super MethodInvocation> dispatch) {
            this.type = type;
            this.dispatch = dispatch;
        }
		
		
		 public Object invoke(Object target, Method method, Object[] parameters) throws Throwable {
            dispatch.dispatch(new MethodInvocation(method, parameters));
        
        }
		
In DefaultGradle's constructor
buildListenerBroadcast = listenerManager.createAnonymousBroadcaster(BuildListener.class);
->DefaultListenerManager.java
    public <T> ListenerBroadcast<T> createAnonymousBroadcaster(Class<T> listenerClass) {
        ListenerBroadcast<T> broadcast = new ListenerBroadcast(listenerClass);
        broadcast.add(getBroadcasterInternal(listenerClass).getSource());
        return broadcast;
    }
->
    private <T> ListenerBroadcast<T> getBroadcasterInternal(Class<T> listenerClass) {
        synchronized (lock) {
            ListenerBroadcast<T> broadcaster = broadcasters.get(listenerClass);
            if (broadcaster == null) {
                broadcaster = new ListenerBroadcast<T>(listenerClass);
                broadcaster.add(getLogger(listenerClass));    //so BuildLogger 's method buildStarted can be called later.
                broadcaster.add(getDispatcher(listenerClass));
                if (parent != null) {
                    broadcaster.add(parent.getDispatcher(listenerClass));
                }
                broadcasters.put(listenerClass, broadcaster);
            }

            return broadcaster;
        }
    }
at this time before execute the function 'getBroadcasterInternal'
broadcasters =
{interface org.gradle.api.execution.TaskExecutionListener=org.gradle.listener.ListenerBroadcast@1160f3c, 
interface org.gradle.groovy.scripts.ScriptExecutionListener=org.gradle.listener.ListenerBroadcast@14236f4, 
interface org.gradle.api.logging.StandardOutputListener=org.gradle.listener.ListenerBroadcast@a6d0a4, 
interface org.gradle.profile.ProfileListener=org.gradle.listener.ListenerBroadcast@25fbfa, 
interface org.gradle.api.execution.TaskExecutionGraphListener=org.gradle.listener.ListenerBroadcast@1c2074c}

Then it can not find 'listenerClass', it will create a new ListenerBroadcast, add 2 or 3 items to its 'broadcast' variable 's  handlers
and put the new object into 'broadcasters' queue.

broadcasters=
{interface org.gradle.api.execution.TaskExecutionListener=org.gradle.listener.ListenerBroadcast@1160f3c, 
interface org.gradle.groovy.scripts.ScriptExecutionListener=org.gradle.listener.ListenerBroadcast@14236f4, 
interface org.gradle.BuildListener=org.gradle.listener.ListenerBroadcast@12d1f6d,   <---------------------new one
interface org.gradle.api.logging.StandardOutputListener=org.gradle.listener.ListenerBroadcast@a6d0a4, 
interface org.gradle.profile.ProfileListener=org.gradle.listener.ListenerBroadcast@25fbfa, 
interface org.gradle.api.execution.TaskExecutionGraphListener=org.gradle.listener.ListenerBroadcast@1c2074c}

script.run()之前,都会script.init(target, services),
这个target就是gradle实例,以后call这个clousre时候的receiver in callsite function.

in DefaultGradleLauncher.java
        // Evaluate init scripts
        initScriptHandler.executeScripts(gradle);
	->
		script.run ()
	->
		init_<a-z>.run()
		public Object run()
		{
			CallSite[] arrayOfCallSite = $getCallSiteArray();return arrayOfCallSite[0].call(arrayOfCallSite[1].callGroovyObjectGetProperty(this), new init_c69lrc3uiec789gk9t0jr56ux._run_closure1(this));return null;
		}
	->
	    public static Object defaultCall(CallSite callSite, Object receiver, Object[] args) throws Throwable {
			return createCallSite(callSite, receiver, args).call(receiver, args);
		}	
		//receiver is our gradle instance, args is array of Closure objects ,
		//[0] = [init_c69lrc3uiec789gk9t0jr56ux$_run_closure1@3701e9]
	-> DefaultGradle.java
		public void projectsLoaded(Closure closure) {
			buildListenerBroadcast.add(new ClosureBackedMethodInvocationDispatch("projectsLoaded", closure));
		}
		

	//In Constructor of DefaultGradleLauncher,  gradle.getBuildListenerBroadcaster() is paased to the constructor, and worked as 
	//private final BuildListener buildListener;
	
	public BuildListener getBuildListenerBroadcaster() {
        return buildListenerBroadcast.getSource();
    }

技术分享


Gradle源码入门学习之十-- Listener & Dispatch

原文:http://blog.csdn.net/cleverwyq/article/details/43838083

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!