01: package samples;
02:
03: import java.beans.*;
04: import java.lang.reflect.*;
05: import net.sf.cglib.proxy.*;
06:
07: /**
08: *
09: * @author baliuka
10: */
11: public class Beans implements MethodInterceptor {
12:
13: private PropertyChangeSupport propertySupport;
14:
15: public void addPropertyChangeListener(
16: PropertyChangeListener listener) {
17:
18: propertySupport.addPropertyChangeListener(listener);
19:
20: }
21:
22: public void removePropertyChangeListener(
23: PropertyChangeListener listener) {
24: propertySupport.removePropertyChangeListener(listener);
25: }
26:
27: public static Object newInstance(Class clazz) {
28: try {
29: Beans interceptor = new Beans();
30: Enhancer e = new Enhancer();
31: e.setSuperclass(clazz);
32: e.setCallback(interceptor);
33: Object bean = e.create();
34: interceptor.propertySupport = new PropertyChangeSupport(
35: bean);
36: return bean;
37: } catch (Throwable e) {
38: e.printStackTrace();
39: throw new Error(e.getMessage());
40: }
41:
42: }
43:
44: static final Class C[] = new Class[0];
45: static final Object emptyArgs[] = new Object[0];
46:
47: public Object intercept(Object obj, Method method, Object[] args,
48: MethodProxy proxy) throws Throwable {
49: Object retValFromSuper = null;
50: try {
51: if (!Modifier.isAbstract(method.getModifiers())) {
52: retValFromSuper = proxy.invokeSuper(obj, args);
53: }
54: } finally {
55: String name = method.getName();
56: if (name.equals("addPropertyChangeListener")) {
57: addPropertyChangeListener((PropertyChangeListener) args[0]);
58: } else if (name.equals("removePropertyChangeListener")) {
59: removePropertyChangeListener((PropertyChangeListener) args[0]);
60: }
61: if (name.startsWith("set") && args.length == 1
62: && method.getReturnType() == Void.TYPE) {
63:
64: char propName[] = name.substring("set".length())
65: .toCharArray();
66:
67: propName[0] = Character.toLowerCase(propName[0]);
68: propertySupport.firePropertyChange(
69: new String(propName), null, args[0]);
70:
71: }
72: }
73: return retValFromSuper;
74: }
75:
76: public static void main(String args[]) {
77:
78: Bean bean = (Bean) newInstance(Bean.class);
79:
80: bean.addPropertyChangeListener(new PropertyChangeListener() {
81: public void propertyChange(PropertyChangeEvent evt) {
82: System.out.println(evt);
83: }
84: });
85:
86: bean.setSampleProperty("TEST");
87:
88: }
89:
90: }
|