http://cglib.sourceforge.net/官网上的文档写得少得可怜,例子等于没有,还不能运行,编译通不过
就拿这个例子来说,Bean类根本就找不到。package cglib;import java.beans.*;
import java.lang.reflect.*;
import net.sf.cglib.proxy.*;
public class Beans implements MethodInterceptor {
private PropertyChangeSupport propertySupport;
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertySupport.removePropertyChangeListener(listener);
}
public static Object newInstance( Class clazz ){
try{
Beans interceptor = new Beans();
Enhancer e = new Enhancer();
e.setSuperclass(clazz);
e.setCallback(interceptor);
Object bean = e.create();
interceptor.propertySupport = new PropertyChangeSupport( bean );
return bean;
}catch( Throwable e ){
e.printStackTrace();
throw new Error(e.getMessage());
}
}
static final Class C[] = new Class[0];
static final Object emptyArgs [] = new Object[0];
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object retValFromSuper = null;
try {
if (!Modifier.isAbstract(method.getModifiers())) {
retValFromSuper = proxy.invokeSuper(obj, args);
}
} finally {
String name = method.getName();
if( name.equals("addPropertyChangeListener")) {
addPropertyChangeListener((PropertyChangeListener)args[0]);
}else if ( name.equals( "removePropertyChangeListener" ) ){
removePropertyChangeListener((PropertyChangeListener)args[0]);
}
if( name.startsWith("set") &&
args.length == 1 &&
method.getReturnType() == Void.TYPE ){
char propName[] = name.substring("set".length()).toCharArray();
propName[0] = Character.toLowerCase( propName[0] );
propertySupport.firePropertyChange( new String( propName ) , null , args[0]);
}
}
return retValFromSuper;
}
public static void main( String args[] ){
Bean bean = (Bean)newInstance( Bean.class );
bean.addPropertyChangeListener(
new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent evt){
System.out.println(evt);
}
}
);
bean.setSampleProperty("TEST");
}
}
就拿这个例子来说,Bean类根本就找不到。package cglib;import java.beans.*;
import java.lang.reflect.*;
import net.sf.cglib.proxy.*;
public class Beans implements MethodInterceptor {
private PropertyChangeSupport propertySupport;
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertySupport.removePropertyChangeListener(listener);
}
public static Object newInstance( Class clazz ){
try{
Beans interceptor = new Beans();
Enhancer e = new Enhancer();
e.setSuperclass(clazz);
e.setCallback(interceptor);
Object bean = e.create();
interceptor.propertySupport = new PropertyChangeSupport( bean );
return bean;
}catch( Throwable e ){
e.printStackTrace();
throw new Error(e.getMessage());
}
}
static final Class C[] = new Class[0];
static final Object emptyArgs [] = new Object[0];
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object retValFromSuper = null;
try {
if (!Modifier.isAbstract(method.getModifiers())) {
retValFromSuper = proxy.invokeSuper(obj, args);
}
} finally {
String name = method.getName();
if( name.equals("addPropertyChangeListener")) {
addPropertyChangeListener((PropertyChangeListener)args[0]);
}else if ( name.equals( "removePropertyChangeListener" ) ){
removePropertyChangeListener((PropertyChangeListener)args[0]);
}
if( name.startsWith("set") &&
args.length == 1 &&
method.getReturnType() == Void.TYPE ){
char propName[] = name.substring("set".length()).toCharArray();
propName[0] = Character.toLowerCase( propName[0] );
propertySupport.firePropertyChange( new String( propName ) , null , args[0]);
}
}
return retValFromSuper;
}
public static void main( String args[] ){
Bean bean = (Bean)newInstance( Bean.class );
bean.addPropertyChangeListener(
new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent evt){
System.out.println(evt);
}
}
);
bean.setSampleProperty("TEST");
}
}
好像不是停止,而是没有什么可开发了的吧。spring的aop就是用它实现的。