Skip to content

Commit e69a9a8

Browse files
author
Mihail Slavchev
committed
Abstract binding generator API so that it does not use reflection
1 parent 7a7b11e commit e69a9a8

8 files changed

Lines changed: 581 additions & 399 deletions

File tree

binding-generator/src/main/java/com/tns/bindings/Dump.java

Lines changed: 148 additions & 396 deletions
Large diffs are not rendered by default.

binding-generator/src/main/java/com/tns/bindings/ProxyGenerator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import android.util.Log;
1111

12+
import com.tns.bindings.desc.ClassDescriptor;
13+
1214
public class ProxyGenerator
1315
{
1416
private String path;
@@ -29,7 +31,7 @@ public void setProxyThumb(String proxyThumb)
2931
}
3032

3133

32-
public String generateProxy(String proxyName, Class<?> classToProxy, String[] methodOverrides, boolean isInterface) throws IOException
34+
public String generateProxy(String proxyName, ClassDescriptor classToProxy, String[] methodOverrides, boolean isInterface) throws IOException
3335
{
3436
HashSet<String> methodOverridesSet = null;
3537

@@ -45,7 +47,7 @@ public String generateProxy(String proxyName, Class<?> classToProxy, String[] me
4547
return generateProxy(proxyName, classToProxy, methodOverridesSet, isInterface);
4648
}
4749

48-
public String generateProxy(String proxyName, Class<?> classToProxy, HashSet<String> methodOverrides, boolean isInterface) throws IOException
50+
public String generateProxy(String proxyName, ClassDescriptor classToProxy, HashSet<String> methodOverrides, boolean isInterface) throws IOException
4951
{
5052
ApplicationWriter aw = new ApplicationWriter();
5153
aw.visit();
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package com.tns.bindings.desc;
2+
3+
public interface ClassDescriptor extends Descriptor{
4+
class PrimitiveTypeInfo implements ClassDescriptor {
5+
private final String sig;
6+
7+
PrimitiveTypeInfo(String sig) {
8+
this.sig = sig;
9+
}
10+
11+
@Override
12+
public boolean isPrimitive() {
13+
return true;
14+
}
15+
16+
@Override
17+
public boolean isArray() {
18+
return false;
19+
}
20+
21+
@Override
22+
public boolean isInterface() {
23+
return false;
24+
}
25+
26+
@Override
27+
public String getSignature() {
28+
return sig;
29+
}
30+
31+
@Override
32+
public String getName() {
33+
return sig;
34+
}
35+
36+
@Override
37+
public MethodDescriptor[] getConstructors() {
38+
return new MethodDescriptor[0];
39+
}
40+
41+
@Override
42+
public ClassDescriptor getComponentType() {
43+
return null;
44+
}
45+
46+
@Override
47+
public MethodDescriptor[] getDeclaredMethods() {
48+
return new MethodDescriptor[0];
49+
}
50+
51+
@Override
52+
public ClassDescriptor[] getInterfaces() {
53+
return new ClassDescriptor[0];
54+
}
55+
56+
@Override
57+
public ClassDescriptor getSuperclass() {
58+
return null;
59+
}
60+
61+
@Override
62+
public boolean isSynthetic() {
63+
return false;
64+
}
65+
66+
@Override
67+
public boolean isStatic() {
68+
return false;
69+
}
70+
71+
@Override
72+
public boolean isPrivate() {
73+
return false;
74+
}
75+
76+
@Override
77+
public boolean isPublic() {
78+
return false;
79+
}
80+
81+
@Override
82+
public boolean isProtected() {
83+
return false;
84+
}
85+
86+
@Override
87+
public boolean isFinal() {
88+
return false;
89+
}
90+
91+
public static String getBoxedTypeName(ClassDescriptor c) {
92+
String name = null;
93+
if (c.isPrimitive()) {
94+
char ch = c.getSignature().charAt(0);
95+
switch (ch) {
96+
case 'V':
97+
name = Void.class.getName();
98+
break;
99+
case 'Z':
100+
name = Boolean.class.getName();
101+
break;
102+
case 'C':
103+
name = Character.class.getName();
104+
break;
105+
case 'B':
106+
name = Byte.class.getName();
107+
break;
108+
case 'S':
109+
name = Short.class.getName();
110+
break;
111+
case 'I':
112+
name = Integer.class.getName();
113+
break;
114+
case 'J':
115+
name = Long.class.getName();
116+
break;
117+
case 'F':
118+
name = Float.class.getName();
119+
break;
120+
case 'D':
121+
name = Double.class.getName();
122+
break;
123+
}
124+
}
125+
return name;
126+
}
127+
}
128+
boolean isPrimitive();
129+
130+
boolean isArray();
131+
132+
boolean isInterface();
133+
134+
String getSignature();
135+
136+
String getName();
137+
138+
MethodDescriptor[] getConstructors();
139+
140+
ClassDescriptor getComponentType();
141+
142+
MethodDescriptor[] getDeclaredMethods();
143+
144+
ClassDescriptor[] getInterfaces();
145+
146+
ClassDescriptor getSuperclass();
147+
148+
static ClassDescriptor VOID = new PrimitiveTypeInfo("V");
149+
static ClassDescriptor BOOLEAN = new PrimitiveTypeInfo("Z");
150+
static ClassDescriptor CHAR = new PrimitiveTypeInfo("C");
151+
static ClassDescriptor BYTE = new PrimitiveTypeInfo("B");
152+
static ClassDescriptor SHORT = new PrimitiveTypeInfo("S");
153+
static ClassDescriptor INT = new PrimitiveTypeInfo("I");
154+
static ClassDescriptor LONG = new PrimitiveTypeInfo("J");
155+
static ClassDescriptor FLOAT = new PrimitiveTypeInfo("F");
156+
static ClassDescriptor DOUBLE = new PrimitiveTypeInfo("D");
157+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.tns.bindings.desc;
2+
3+
public interface Descriptor {
4+
boolean isSynthetic();
5+
6+
boolean isStatic();
7+
8+
boolean isPrivate();
9+
10+
boolean isPublic();
11+
12+
boolean isProtected();
13+
14+
boolean isFinal();
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.tns.bindings.desc;
2+
3+
public interface MethodDescriptor extends Descriptor {
4+
ClassDescriptor[] getParameterTypes();
5+
6+
String getName();
7+
8+
ClassDescriptor getReturnType();
9+
10+
String toGenericString();
11+
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package com.tns.bindings.desc.reflection;
2+
3+
import com.tns.bindings.desc.ClassDescriptor;
4+
import com.tns.bindings.desc.MethodDescriptor;
5+
6+
import java.lang.reflect.Constructor;
7+
import java.lang.reflect.Method;
8+
import java.lang.reflect.Modifier;
9+
10+
public class ClassInfo implements ClassDescriptor {
11+
private final Class<?> clazz;
12+
13+
public ClassInfo(Class<?> clazz) {
14+
this.clazz = clazz;
15+
}
16+
17+
@Override
18+
public boolean equals(Object o) {
19+
if ((o == null) || !(o instanceof ClassDescriptor)) {
20+
return false;
21+
}
22+
ClassDescriptor other = (ClassDescriptor)o;
23+
return getSignature().equals(other.getSignature());
24+
}
25+
26+
@Override
27+
public boolean isPrimitive() {
28+
return clazz.isPrimitive();
29+
}
30+
31+
@Override
32+
public boolean isArray() {
33+
return clazz.isArray();
34+
}
35+
36+
@Override
37+
public boolean isInterface() {
38+
return clazz.isInterface();
39+
}
40+
41+
@Override
42+
public String getSignature() {
43+
String sig;
44+
if (clazz == void.class) {
45+
sig = "V";
46+
} else if (clazz == boolean.class) {
47+
sig = "Z";
48+
} else if (clazz == char.class) {
49+
sig = "C";
50+
} else if (clazz == byte.class) {
51+
sig = "B";
52+
} else if (clazz == short.class) {
53+
sig = "S";
54+
} else if (clazz == int.class) {
55+
sig = "I";
56+
} else if (clazz == long.class) {
57+
sig = "J";
58+
} else if (clazz == float.class) {
59+
sig = "F";
60+
} else if (clazz == double.class) {
61+
sig = "D";
62+
} else {
63+
sig = clazz.getName();
64+
}
65+
return sig;
66+
}
67+
68+
@Override
69+
public String getName() {
70+
return clazz.getName();
71+
}
72+
73+
@Override
74+
public MethodDescriptor[] getConstructors() {
75+
Constructor<?>[] ctors = clazz.getConstructors();
76+
MethodDescriptor[] ret = new MethodDescriptor[ctors.length];
77+
for (int i=0; i<ctors.length; i++) {
78+
ret[i] = new MethodInfo(ctors[i]);
79+
}
80+
return ret;
81+
}
82+
83+
@Override
84+
public ClassDescriptor getComponentType() {
85+
return new ClassInfo(clazz.getComponentType());
86+
}
87+
88+
@Override
89+
public MethodDescriptor[] getDeclaredMethods() {
90+
Method[] methods = clazz.getDeclaredMethods();
91+
MethodDescriptor[] ret = new MethodDescriptor[methods.length];
92+
for (int i=0; i<methods.length; i++) {
93+
ret[i] = new MethodInfo(methods[i]);
94+
}
95+
return ret;
96+
}
97+
98+
@Override
99+
public ClassDescriptor[] getInterfaces() {
100+
Class<?>[] ifaces = clazz.getInterfaces();
101+
ClassDescriptor[] ret = new ClassDescriptor[ifaces.length];
102+
for (int i=0; i<ifaces.length; i++) {
103+
ret[i] = new ClassInfo(ifaces[i]);
104+
}
105+
return ret;
106+
}
107+
108+
@Override
109+
public ClassDescriptor getSuperclass() {
110+
Class<?> superClass = clazz.getSuperclass();
111+
return (superClass != null) ? new ClassInfo(superClass) : null;
112+
}
113+
114+
@Override
115+
public boolean isSynthetic() {
116+
return clazz.isSynthetic();
117+
}
118+
119+
@Override
120+
public boolean isStatic() {
121+
return Modifier.isStatic(clazz.getModifiers());
122+
}
123+
124+
@Override
125+
public boolean isPrivate() {
126+
return Modifier.isPrivate(clazz.getModifiers());
127+
}
128+
129+
@Override
130+
public boolean isPublic() {
131+
return Modifier.isPublic(clazz.getModifiers());
132+
}
133+
134+
@Override
135+
public boolean isProtected() {
136+
return Modifier.isProtected(clazz.getModifiers());
137+
}
138+
139+
@Override
140+
public boolean isFinal() {
141+
return Modifier.isFinal(clazz.getModifiers());
142+
}
143+
}

0 commit comments

Comments
 (0)