注解机制和xml配置方案异曲同工。都是通过反射机制,由框架来完成操作。下面我就实现一下自定义注解。
自定义注解分为两个部分,一个是自定义注解,一个是自定义注解的解释部分,就以自定义注解,实现连接Oracle数据库为例
自定义注解代码:
package com.yc.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/***
*
* @author Administrator
* 元注解JDBC
*
*/
//目标注解的位置
@Target(ElementType.METHOD)
//运行时保留注解
@Retention(RetentionPolicy.RUNTIME)
//注解保留着javadoc中
@Documented
//支持继承注解
@Inherited
public @interface JDBC {
//注解的值
public String userName();
public String userPwd();
public String url();
public String driver();
}
注解解释:
package com.yc.annotation.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import com.yc.annotation.JDBC;
public class PaserAnnotation {
//通过反射获得有注解参数的类
public Connection PaserMethod(Class c) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Connection con=null;
Object obj=c.newInstance();
//获得所有的方法
Method[] ms=c.getMethods();
//循环所有的方法,找到有JDBC注解的方法
for(Method m:ms){
JDBC jdbc=m.getAnnotation(JDBC.class);
if(jdbc!=null){
//激活有JDBC注解的方法
con=(Connection) m.invoke(obj, jdbc.userName(),jdbc.userPwd(),jdbc.url(),jdbc.driver());
}
}
return con;
}
}
使用注解的类:
package com.yc.annotation;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Test2 {
//注解以及注解的参数
@JDBC(userName="scott",userPwd="a",url="JDBC:oracle:thin:@localhost:1521:orcl",driver="oracle.jdbc.driver.OracleDriver")
public Connection getConnection(String userName,String userPwd,String url,String driver) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
Class.forName(driver).newInstance();
Connection con = DriverManager.getConnection(url, userName, userPwd);
return con;
}
}
测试代码:
package com.yc.test;
import static org.junit.Assert.*;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.Test;
import com.yc.annotation.Test2;
import com.yc.annotation.util.PaserAnnotation;
public class PaserAnnotationTest {
@Test
public void testPaserAnnotation() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SQLException {
PaserAnnotation pa=new PaserAnnotation();
Connection con=pa.PaserMethod(Test2.class);
System.out.println(con);
assertNotNull(con);
con.close();
}
}