3
A
回答
1
你可以用下面的代码滚动自己的99%。由于需要封装某个集合的成员,它会给您带来两个编译错误,但它确实会让您超过不再值得自动化的地步。
package so;
import javax.persistence.*;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.*;
public class CheckedPersistenceMaker {
static final String PACKAGE = "stackoverflow.javax.persistence";
static final String PACKAGE_DIR = PACKAGE.replace('.', '/');
static Class<?>[] CLASSES = new Class<?>[] { Cache.class,
EntityManager.class, EntityManagerFactory.class,
EntityTransaction.class, Parameter.class,
PersistenceUnitUtil.class, PersistenceUtil.class,
Persistence.class, Query.class, Tuple.class, TupleElement.class,
TypedQuery.class };
private static String getName(Class<?> c) {
String name = c.getName();
for(Class<?> p:CLASSES) {
if (p.equals(c))
return PACKAGE + ".Checked"
+ name.substring(name.lastIndexOf('.') + 1);
}
return c.getName();
}
static void generateWrapper(Class<?> c) throws Exception {
String name = c.getName();
TypeVariable<?>[] genType = c.getTypeParameters();
String varNames = "";
if (genType != null && genType.length != 0) {
StringBuilder b = new StringBuilder();
b.append("<");
for(int i = 0;i < genType.length;i++) {
if (i > 0) b.append(",");
b.append(genType[i].getName());
}
b.append(">");
varNames = b.toString();
}
name = "Checked" + name.substring(name.lastIndexOf('.') + 1);
File javaFile = new File(PACKAGE_DIR + "/" + name + ".java");
javaFile.getParentFile().mkdirs();
FileWriter w = new FileWriter(javaFile);
w.write("package " + PACKAGE + ";\n");
w.write("public class " + name + varNames + " {\n");
w.write(" private final " + c.getName() + varNames
+ " wrapped;\n\n ");
w.write(name + "(" + c.getName() + varNames
+ " original) {\nwrapped=original;\n}\n\n");
w.write(" public " + c.getName() + varNames
+ " getOriginal() { return wrapped; }\n\n");
Method[] ms = c.getDeclaredMethods();
for(Method m:ms) {
if (!Modifier.isPublic(m.getModifiers())) continue;
w.write(" ");
String s = m.toGenericString();
s = s.replace(" abstract ", " ");
s = s.replace(c.getName() + ".", "");
String q = s.substring(0, s.indexOf('('));
if (q.indexOf('<',10) != -1) q = q.substring(0, q.indexOf('<',10));
boolean needsTranslate = false;
for(Class<?> cc:CLASSES) {
String ccn = cc.getName();
if (q.indexOf(ccn) != -1) needsTranslate = true;
String ccc = ccn.replace(cc.getPackage().getName() + ".",
PACKAGE + ".Checked");
s = s.replace(ccn, ccc);
}
int pc = 0;
int p = s.indexOf('(');
if (s.charAt(p + 1) != ')') {
StringBuilder b = new StringBuilder(s);
int g = 0;
char ch;
do {
ch = b.charAt(p);
switch (ch) {
case '<': {
g++;
break;
}
case '>': {
g--;
break;
}
case ',':
case ')': {
if (g == 0) {
String pa = " p" + pc;
b.insert(p, pa);
pc++;
p += pa.length();
}
break;
}
}
p++;
} while(ch != ')');
s = b.toString();
}
w.write(s);
w.write(" throws CheckedPersistenceException");
Class<?>[] excs = m.getExceptionTypes();
for(Class<?> e:excs) {
w.write(", " + e.getName());
}
w.write(" {\n try {\n ");
Class<?> ret = m.getReturnType();
if (!ret.equals(Void.TYPE)) {
w.write("return ");
if (needsTranslate) {
String retName = ret.getName();
retName = retName.replace(c.getPackage().getName() + ".",
PACKAGE + ".Checked");
w.write("new " + retName + "(");
}
}
if (Modifier.isStatic(m.getModifiers())) {
w.write(c.getName() + "." + m.getName() + "(");
} else {
w.write("wrapped." + m.getName() + "(");
}
Class<?> paramTypes[] = m.getParameterTypes();
for(int i = 0;i < pc;i++) {
if (i > 0) w.write(',');
boolean isChecked = false;
for(int j=0;j<CLASSES.length;j++) {
if(CLASSES[j].equals(paramTypes[i])) isChecked=true;
}
w.write("p" + i);
if(isChecked) w.write(".getOriginal()");
}
w.write(')');
if (needsTranslate) w.write(')');
w.write(";\n } catch (javax.persistence.PersistenceException e) { throw new CheckedPersistenceException(e); }\n }\n\n");
}
w.write("}\n");
w.close();
}
public static void main(String[] args) throws Exception {
for(Class<?> c:CLASSES) {
generateWrapper(c);
}
}
}
+0
我会看看它,谢谢! – TofuBeer 2011-04-04 16:30:04
相关问题
- 1. Google Web Toolkit:未检查异常的异常转换
- 2. 检查与未检查的异常
- 3. 未经检查的异常
- 4. Java:Enerjy - 未检查异常?
- 5. 为什么Clojure wrap使用未经检查的异常来检查异常?
- 6. 为什么运行时异常是未经检查的异常?
- 7. 已检查异常
- 8. 记录未检查的异常
- 9. 经过或未经检查的异常
- 10. 什么是静态异常检查和动态异常检查?
- 11. 检查与未检查的异常代码的可重用性
- 12. 检查VS未经检查的异常统计
- 13. 跟踪未检查(或检查?)异常丢失的位置
- 14. ClassNotFoundException的原因为检查异常
- 15. 避免NullPointerException异常检查
- 16. 检查SQL错误/异常
- 17. 抽象异常检查
- 18. 用硒检查javascript异常?
- 19. java抛出检查异常?
- 20. userdefined检查异常处理
- 21. 空指针异常检查
- 22. 检查异常DOM修改
- 23. 经过检查异常
- 24. 吃异常或检查null?
- 25. Spring JPA异常转换
- 26. java:包装已检查异常的标准方法
- 27. 为什么中断异常检查异常?
- 28. 如何检查是否异常的原因的异常类型
- 29. servlet异常+类转换异常+ Glassfish的+ Netbeans的+ JPA实体+ Vaadin
- 30. JPA查询抛出异常
仍然,你为什么要这么做?如果没有这样的包装,也许有一个原因背后呢? :-P – 2010-11-17 19:05:56
'大多数人不像我对异常的挑剔一样? :-) – TofuBeer 2010-11-17 19:43:41
你最终滚了你自己的?小心分享? – 2011-04-01 08:54:38