java注解
注释
单行注释 //
多行注释 /* */
文档注释/** */
注解 Annotation(注释 注解)
1.注解的写法
@XXX[(一些信息)]
2.注解放置在哪里
类的上面;属性上面;方法上面;构造方法上面;变量上面;参数前面;
3.注解的作用
1.用来充当注释的作用(仅仅是一个文字的说明) @Deprecated
2.用来充当代码的检测(验证) @Override
3.可以携带一些信息(内容) 文件.properties .xml 注解
4.java中有一些人家写好的注解供我们使用;
@Deprecated 用来说明方法是废弃的
@Override 用来做代码检测 检测此方法是否是一个重写
@SuppressWarnings(信息);去掉程序中的警告 String[] {""} 如果数组内的元素只有一个长度 可以不加{}
unused 变量定义后未被使用;
serial 类实现了序列化接口 不添加序列化ID号
rawtypes 集合没有定义泛型
deprecation 方法以废弃
unchecked 出现了泛型的问题 可以不检测 //@SuppressWarnings("unchecked")
all 包含了以上所有 ;@SuppressWarnings("all")
5.注解中可以携带信息 可以不携带 信息不能随意写 信息的类型只能是如下的类型
1.基本数据类型
2.String类型
3.枚举类型enum
4.注解类型@
5.数组类型[] 数组的内部需要是如上的四种类型
6.如何自己描述一个注解类型
1.通过@interface 定义一个新的注解类型
2.发现写法与接口非常相似(可以利用接口的特点来记忆注解)
可以描述public static final的属性 比较少见
可以描述public abstract的方法 方法要求返回值必须有 返回值类型是如上那些
方法的作用是将我们传递的信息 搬走了 交给别人
3.我们自己定义的注解如果想要拿来使用
光定义还不够 还需要做很多细致的说明(需要利用java提供好的注解来说明)
元注解(也是注解 不是拿来使用的 是用来说明注解)
@Target 描述当前的这个注解可以放置在哪里写的
@Retention 描述当前的这个注解存在什么作用域中的
源代码文件-->编译-->字节码文件-->加载-->内存执行
SOURCE CLASS RUNTIME
@Inherited 描述当前这个注解是否被子类对象继承
@Document 描述这个注解是否能被文档所记录
4.自己使用自己描述的注解
如何解析注解内携带的信息(需要反射机制)
1.获取类Class
2.获取类中的成员 类 属性 方法 构造方法
3.Annotation a=成员.getAnnotation(注解类型.class);
4.注解对象 执行方法获取返回结果
注解应用场景
package myannotation; import java.lang.annotation.*; import java.lang.annotation.Target; @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface An{ String[] value() default "小整";//默认方法(或属性)public abstract String[] value(); }
package myannotation; public class Person{ //@An(value={"小张","娜娜"}) //@An("笑话"); @An() private String name; }
package myannotation; import java.lang.reflect.*; import java.lang.annotation.*; @SuppressWarnings("unchecked") public class TestMain{ public static void main(String[] args){ try{ //利用反射技术 Class c=Person.class;//类 Field fn=c.getDeclaredField("name");//属性 Annotation a=fn.getAnnotation(An.class); Class aclass=a.getClass(); Method am=aclass.getMethod("value"); String[] s=(String[])am.invoke(a); //利用正常的对象调用执行过程 //An a=(An)fn.getAnnotation(An.class);//获取注解对象 //String[] s=a.value(); for(String v:s){ System.out.println(v); } }catch(Exception e){ e.printStackTrace(); } } }
---------------------------------------------------------------------------------------------------------------
package myannotation; import java.lang.annotation.*; import java.lang.annotation.Target; @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface An{ String[] value() default "小整";//默认方法(或属性)public abstract String[] value(); }
package myannotation; import java.lang.annotation.*; import java.lang.reflect.*; @SuppressWarnings("unchecked") public class Mys{ public Object getBean(String className){ Object obj=null; try{ Class c=Class.forName(className); //obj=c.newInstance(); Constructor con=c.getConstructor();//无参数的构造方法 obj=con.newInstance(); Annotation a=con.getAnnotation(An.class); Class aclass=a.getClass(); Method am=aclass.getMethod("value"); String[] vs=(String[])am.invoke(a);//获取注解内容 //赋值 Field[] fs=c.getDeclaredFields();//获取全部的私有属性 //for(Field f:fs){ for(int i=0;i<fs.length;i++){ String fn=fs[i].getName();//属性名 Class fntype=fs[i].getType();//属性类型 String firstL=fn.substring(0,1).toUpperCase(); String otherL=fn.substring(1); StringBuilder sb=new StringBuilder("set"); sb.append(firstL); sb.append(otherL); String setfn=sb.toString(); Method md=c.getMethod(setfn,fntype);//方法名 Constructor co=fntype.getConstructor(String.class); md.invoke(obj,co.newInstance(vs[i]));//执行方法 } }catch(Exception e){ e.printStackTrace(); } return obj; } }
package myannotation; public class Person{ private String name; private Integer age; private String sex; @An({"小张","18","男"}) public Person(){ } public String getName(){ return this.name; } public void setName(String name){ this.name=name; } public Integer getAge(){ return age; } public void setAge(Integer age){ this.age=age; } public String getSex(){ return this.sex; } public void setSex(String sex){ this.sex=sex; } public String toString(){ return "name:"+this.name+";age:"+this.age+";sex:"+this.sex; } }
package myannotation; public class User{ private String name; private String password; private Float money; @An({"zs","123456","88.88"}) public User(){ } public String getName(){ return this.name; } public void setName(String name){ this.name=name; } public Float getMoney(){ return money; } public void setMoney(Float money){ this.money=money; } public String getPassword(){ return this.password; } public void setPassword(String password){ this.password=password; } public String toString(){ return "name:"+this.name+";money:"+this.money+";password:"+this.password; } }
package myannotation; //import java.lang.reflect.*; //import java.lang.annotation.*; //@SuppressWarnings("unchecked") public class TestMain{ public static void main(String[] args){ Mys m=new Mys(); //Person p=(Person)m.getBean("myannotation.Person"); User p=(User)m.getBean("myannotation.User"); System.out.println(p); } }