📄 monitorfilereadsdirectly.aj
字号:
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); } private 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -