自定义注解

来源:互联网 发布:知乎匿名提问 编辑:程序博客网 时间:2024/04/30 05:53

注解机制和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//支持继承注解@Inheritedpublic @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();    }}
0 0