1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.proxy.factory.javassist;
19
20 import javassist.CannotCompileException;
21 import javassist.ClassPool;
22 import javassist.CtClass;
23 import javassist.CtField;
24 import javassist.LoaderClassPath;
25 import javassist.NotFoundException;
26 import org.apache.commons.proxy.ProxyUtils;
27 import org.apache.commons.proxy.exception.ObjectProviderException;
28
29 import java.util.HashSet;
30 import java.util.Set;
31
32
33
34
35
36
37
38 class JavassistUtils
39 {
40
41
42
43 public static final String DEFAULT_BASE_NAME = "JavassistUtilsGenerated";
44 private static int classNumber = 0;
45 private static final ClassPool classPool = new ClassPool();
46
47 static
48 {
49 classPool.appendClassPath( new LoaderClassPath( ClassLoader.getSystemClassLoader() ) );
50 }
51
52 private static final Set classLoaders = new HashSet();
53
54
55
56
57
58
59
60
61
62
63
64
65 public static void addField( Class fieldType, String fieldName, CtClass enclosingClass )
66 throws CannotCompileException
67 {
68 enclosingClass.addField( new CtField( resolve( fieldType ), fieldName, enclosingClass ) );
69 }
70
71
72
73
74
75
76
77 public static CtClass resolve( Class clazz )
78 {
79 synchronized( classLoaders )
80 {
81 try
82 {
83 final ClassLoader loader = clazz.getClassLoader();
84 if( loader != null && !classLoaders.contains( loader ) )
85 {
86 classLoaders.add( loader );
87 classPool.appendClassPath( new LoaderClassPath( loader ) );
88 }
89 return classPool.get( ProxyUtils.getJavaClassName( clazz ) );
90 }
91 catch( NotFoundException e )
92 {
93 throw new ObjectProviderException(
94 "Unable to find class " + clazz.getName() + " in default Javassist class pool.", e );
95 }
96 }
97 }
98
99
100
101
102
103
104
105 public static void addInterfaces( CtClass ctClass, Class[] proxyClasses )
106 {
107 for( int i = 0; i < proxyClasses.length; i++ )
108 {
109 Class proxyInterface = proxyClasses[i];
110 ctClass.addInterface( resolve( proxyInterface ) );
111 }
112 }
113
114
115
116
117
118
119
120 public static CtClass createClass( Class superclass )
121 {
122 return createClass( DEFAULT_BASE_NAME, superclass );
123 }
124
125
126
127
128
129
130
131
132 public synchronized static CtClass createClass( String baseName, Class superclass )
133 {
134 return classPool.makeClass( baseName + "_" + classNumber++, resolve( superclass ) );
135 }
136
137
138
139
140
141
142
143 public static CtClass[] resolve( Class[] classes )
144 {
145 final CtClass[] ctClasses = new CtClass[classes.length];
146 for( int i = 0; i < ctClasses.length; ++i )
147 {
148 ctClasses[i] = resolve( classes[i] );
149 }
150 return ctClasses;
151 }
152 }
153