` package orm.util;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import orm.annotation.sql.Delete;
import orm.annotation.sql.Insert;
import orm.annotation.sql.Select;
import orm.annotation.sql.Update;
import orm.dao.StudentDao;
public class Impl {
public static void main(String[] args) throws Exception {
long start=System.currentTimeMillis();
//第一个参数:自定义生成类的名字;第二个参数:继承的接口
StudentDao dao=(StudentDao) getDao("StudentDaoImpl", "orm.dao.StudentDao");
System.out.println("生成字节码:"+(System.currentTimeMillis()-start));
}
/**
* 获取方法注解上面的SQL
* [@param](http://my.oschina.net/u/2303379) method
* [@return](http://my.oschina.net/u/556800)
*/
private static Object getMethodAnnotation(Method method){
Object annotation=null;
String sql="";
if(method.isAnnotationPresent(Select.class)){
annotation=method.getAnnotation(Select.class);
sql=((Select) annotation).value();
}else if(method.isAnnotationPresent(Insert.class)){
annotation=method.getAnnotation(Insert.class);
sql=((Insert) annotation).value();
}else if(method.isAnnotationPresent(Update.class)){
annotation=method.getAnnotation(Update.class);
sql=((Update) annotation).value();
}else if(method.isAnnotationPresent(Delete.class)){
annotation=method.getAnnotation(Delete.class);
sql=((Delete) annotation).value();
}
System.out.println("getMethodAnnotation方法获取注解的值:"+sql);
return annotation;
}
// private static String getClassName(String className){
// //1.找到空格的下标
// int index=className.indexOf(" ");
// //2.截取字符串
// String str=className.substring(0, index+2);
// System.out.println(str);
// return "";
// }
/**
* 传入类信息,获取方法的拼接逻辑,并返回方法拼接后的字符串
* [@param](http://my.oschina.net/u/2303379) c
* [@return](http://my.oschina.net/u/556800)
*/
private static String getMethodStrs(Class c){
Method[] methods=c.getDeclaredMethods();
//定义方法字符串
String methodStr="";
//获取方法信息
for(Method method:methods){
methodStr = getMethodStr(methodStr, method);
}
return methodStr;
}
/**
* 传入方法参数,拼接方法名
* [@param](http://my.oschina.net/u/2303379) methodStr
* @param method
* @return
*/
private static String getMethodStr(String methodStr, Method method) {
//获取方法名
String methodName=method.getName();
//获取返回值类型
String returnTypeName=method.getReturnType().getName();
//获取参数集合
String parameterName="";
Class[] classes =method.getParameterTypes();
//拼接参数的字符串
if(classes.length!=0&&classes!=null){
for(int i=0;i<classes.length;i++){
parameterName+=(classes[i].getName()+" "+(char)(i+97)+",");
}
parameterName=parameterName.substring(0, parameterName.length()-1);
}
//执行方法体
String methodBody="System.out.println(\"执行方法:\"+\""+methodName+"\");";
//方法结尾
String methodEnd="";
if(!returnTypeName.equals("void")){
methodEnd="return null;";
}
methodStr+=
"public "+returnTypeName+" "+methodName+"("+parameterName+"){" +
methodBody + methodEnd+
"}";
return methodStr;
}
/**
* 获取dao对象
* @param implName 继承的对象
* @param daoInterface dao接口的位置信息
* @return
*/
public static Object getDao(String implName,String daoInterface) {
Class interfaceClass=null;
try {
interfaceClass=Class.forName(daoInterface);
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
}
//Java 源代码
String sourceStr=
"public class "+implName+" implements "+daoInterface+"{ " +
getMethodStrs(interfaceClass)+
"}";
// 类名及文件名
String clsName = implName;
// 方法名
//String methodName = "findAll";
// 当前编译器
JavaCompiler cmp = ToolProvider.getSystemJavaCompiler();
//Java 标准文件管理器
StandardJavaFileManager fm = cmp.getStandardFileManager(null,null,null);
//Java 文件对象
JavaFileObject jfo = (JavaFileObject) new StringJavaObject(clsName,sourceStr);
//JavaFileObject jfo1 = (JavaFileObject) new StringJavaObject("hello",sourceStr);
// 编译参数,类似于javac <options> 中的options
List<String> optionsList = new ArrayList<String>();
// 编译文件的存放地方,注意:此处是为Eclipse 工具特设的
optionsList.addAll(Arrays.asList("-d","./bin"));
// 要编译的单元
List<JavaFileObject> jfos = Arrays.asList(jfo);
// 设置编译环境
JavaCompiler.CompilationTask task = cmp.getTask(null, fm, null,optionsList,null,jfos);
// 编译成功
if(task.call()){
// 生成对象
try {
Object obj = Class.forName(clsName).newInstance();
Class<? extends Object> cls = obj.getClass();
return obj;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
return null;
}
}
// 文本中的Java 对象
class StringJavaObject extends SimpleJavaFileObject{
// 源代码
private String content = "";
// 遵循Java 规范的类名及文件
public StringJavaObject(String _javaFileName,String _content){
super(_createStringJavaObjectUri(_javaFileName),Kind.SOURCE);
content = _content;
}
// 产生一个URL 资源路径
private static URI _createStringJavaObjectUri(String name){
// 注意此处没有设置包名
return URI.create("String:///" + name + Kind.SOURCE.extension);
}
// 文本文件代码
public CharSequence getCharContent(boolean ignoreEncodingErrors)
throws IOException {
return content;
}
}`