⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 instrumenttask.java

📁 一个Java持久层类库
💻 JAVA
字号:
//$Id: InstrumentTask.java 10206 2006-08-03 19:59:42Z steve.ebersole@jboss.com $package org.hibernate.tool.instrument.cglib;import org.hibernate.bytecode.util.BasicClassFilter;import org.hibernate.bytecode.util.ClassDescriptor;import org.hibernate.bytecode.cglib.BytecodeProviderImpl;import org.hibernate.bytecode.ClassTransformer;import org.hibernate.tool.instrument.BasicInstrumentationTask;import org.objectweb.asm.ClassReader;import java.io.ByteArrayInputStream;import net.sf.cglib.core.ClassNameReader;import net.sf.cglib.transform.impl.InterceptFieldEnabled;/** * An Ant task for instrumenting persistent classes in order to enable * field-level interception using CGLIB. * <p/> * In order to use this task, typically you would define a a taskdef * similiar to:<pre> * <taskdef name="instrument" classname="org.hibernate.tool.instrument.cglib.InstrumentTask"> *     <classpath refid="lib.class.path"/> * </taskdef> * </pre> * where <tt>lib.class.path</tt> is an ANT path reference containing all the * required Hibernate and CGLIB libraries. * <p/> * And then use it like:<pre> * <instrument verbose="true"> *     <fileset dir="${testclasses.dir}/org/hibernate/test"> *         <include name="yadda/yadda/**"/> *         ... *     </fileset> * </instrument> * </pre> * where the nested ANT fileset includes the class you would like to have * instrumented. * <p/> * Optionally you can chose to enable "Extended Instrumentation" if desired * by specifying the extended attriubute on the task:<pre> * <instrument verbose="true" extended="true"> *     ... * </instrument> * </pre> * See the Hibernate manual regarding this option. * * @author Gavin King * @author Steve Ebersole */public class InstrumentTask extends BasicInstrumentationTask {	private static final BasicClassFilter CLASS_FILTER = new BasicClassFilter();	private final BytecodeProviderImpl provider = new BytecodeProviderImpl();	protected ClassDescriptor getClassDescriptor(byte[] byecode) throws Exception {		return new CustomClassDescriptor( byecode );	}	protected ClassTransformer getClassTransformer(ClassDescriptor descriptor) {		if ( descriptor.isInstrumented() ) {			logger.verbose( "class [" + descriptor.getName() + "] already instrumented" );			return null;		}		else {			return provider.getTransformer( CLASS_FILTER, new CustomFieldFilter( descriptor ) );		}	}	private static class CustomClassDescriptor implements ClassDescriptor {		private final byte[] bytecode;		private final String name;		private final boolean isInstrumented;		public CustomClassDescriptor(byte[] bytecode) throws Exception {			this.bytecode = bytecode;			ClassReader reader = new ClassReader( new ByteArrayInputStream( bytecode ) );			String[] names = ClassNameReader.getClassInfo( reader );			this.name = names[0];			boolean instrumented = false;			for ( int i = 1; i < names.length; i++ ) {				if ( InterceptFieldEnabled.class.getName().equals( names[i] ) ) {					instrumented = true;					break;				}			}			this.isInstrumented = instrumented;		}		public String getName() {			return name;		}		public boolean isInstrumented() {			return isInstrumented;		}		public byte[] getBytes() {			return bytecode;		}	}}

⌨️ 快捷键说明

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