monitorfilereadsdirectly.aj~

来自「designpatterns for aop」· AJ~ 代码 · 共 66 行

AJ~
66
字号
package designpatterns.decorator.aspectjdirect;import java.io.InputStream;import java.util.Map;import java.util.WeakHashMap;import javax.swing.JComponent;public aspect MonitorFileReadsDirectly {	private Map perStreamMonitor = new WeakHashMap();		pointcut singleRead(JComponent component, InputStream is):		call(public int InputStream+.read()) && target(is)		&& fromAComponent(component);		pointcut arrayRead(JComponent component, InputStream is) :		call(public int InputStream+.read(..)) && target(is)		&& fromAComponent(component);		pointcut fromAComponent(JComponent component) : 		cflow(execution(* javax.swing.JComponent+.*(..))			&& this(component));		after(JComponent component, InputStream is) returning :		singleRead(component, is)	{		updateMonitor(component, is, 1);	}		after(JComponent component, InputStream is) returning (int bytesRead) :		arrayRead(component, is)	{//		updateMonitor(component, is, bytesRead);	}		before(InputStream is): 		call(public void InputStream+.close())		&& target(is)	{		System.out.println("Discarding monitor.");		perStreamMonitor.remove(is);	}		private void updateMonitor(JComponent component, InputStream is, int amount){		IncrementMonitor monitor = (IncrementMonitor)perStreamMonitor.get(is);		if(monitor == null){			monitor = initMonitor(is, component);		}		monitor.increment(amount);	}		protected IncrementMonitor initMonitor(InputStream is, JComponent component){		try {			int size = is.available();			IncrementMonitor monitor = 				new IncrementMonitor(component, size);			perStreamMonitor.put(is, monitor);			return monitor;		} catch (Exception e) {			throw new RuntimeException(e);		}	}	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?