自定义注解
来源:互联网 发布:知乎匿名提问 编辑:程序博客网 时间: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
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- @自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 调整WORD2010的行距与段落间距
- Https原理介绍
- MySql触发器使用讲解
- struts注解(新旧对比)
- Linux - /etc/passwd和/etc/shadow文件结构
- 自定义注解
- Product of Array Except Self
- Android文件上传
- GDB调试程序(一)
- 【QQ机器人开发】茉莉QQ机器人3.X系列插件开发文档
- UVALive - 4452 The Ministers' Major Mess(2-SAT)
- TextView的一些使用
- poj3207Ikki's Story IV - Panda's Trick tarjan缩点
- 零基础学python-1.3 通过idle启动python