最近在学习spring。里面有一个非常的强大的功能叫做注解,刚才,同学们的每日一讲讲到了注解,学以致用来总计一下注解机制
什么是注解?
注解(Annotation):提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻方便的使用这些数据(通过解析注解来使用这些数据),用来将任何的信息或者元数据与程序元素(类、方法、成员变量等)进行关联。其实就是更加直观更加明了的说明,这些说明信息与程序业务逻辑没有关系,并且是供指定的工
Annotation其实是一种接口。通过java的反射机制相关的API来访问Annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。Java语言解释
器在工作时会忽略这些Annotation,因此在JVM中这些Annotation是“不起作用”的,只能通过配套的工具才能对这些Annotation类型的信息进行访问和处理。
Annotation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的申明语句中。
用注解来连接MySQL的例子学习注解
首先我们说过注解就像接口,所以自定义一个注解。
Dbinfo.java
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;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface Dbinfo {
public String url();
public String drivername();
public String username();
public String password();
}
=====参数解释=====
@Documented :将此注解包含在 javadoc 中
@Retention :表示在什么级别保存该注解信息
@Retention这里面有这些级别
@Target:表示该注解用于什么地方
@Target有这些地方可以用到:
@Inherited :允许子类继承父类中的注解
声明好了一个自己的注解方法,我们就要来解析这个注解,这里主要用到反射的知识。
ParseAnnotation.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.rindy.maven.self_annotation.Dbinfo;
public class ParseAnnotation {
public void parseMethod(Class clazz) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
Object obj = clazz.newInstance();
Method[] methods=clazz.getDeclaredMethods();
for(Method m:methods){
Dbinfo db=m.getAnnotation(Dbinfo.class);
String url="";
String drivername="";
String username="";
String password="";
if(db!=null){
url=db.url();
drivername=db.drivername();
username=db.username();
password=db.password();
m.invoke(obj, url,drivername,username,password);
}
}
}
}
其中我们用到了getDeclaredMethods带得到里面的方法,那么 我们回顾一下
getDeclaredMethods()和getMethods()区别
getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
然后我们使用我们的注解,因为是测试连接MySQL数据库,所有别忘记到MySQL的驱动包和开启MySQL服务。
SayHello.java –用来使用注解连接MySQL
import java.sql.DriverManager;
import com.mysql.jdbc.Connection;
public class SayHello{
@Dbinfo( url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8", drivername="com.mysql.jdbc.Driver",username="root" , password="a")
public Connection getCon( String url, String drivername, String username, String password ) throws Exception{
Class.forName( drivername).newInstance();
System.out.println(drivername);
Connection con=null;
//if(url!=null&&username!=null&&password!=null){
con=(Connection) DriverManager.getConnection( url, username, password);
System.out.println(con);
//}
return con;
}
}
测试类测试:
public void testApp() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
{
ParseAnnotation pa=new ParseAnnotation();
pa.parseMethod(SayHello.class);
}
测试结果:
好勒连接数据库的自定义注解方式写完了,至此对注解的使用有了一个大致的了解和使用。