zoukankan      html  css  js  c++  java
  • 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);
    	}
    }
    

      

     

     

     

      

      

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    作业2 求题目中的数
    2013 C#单元测试
    实现项目WC
    带括号多项式版四则运算
    20道简单加减法随机生成程序扩展版体会
    20道简单加减法随机生成程序
    Jeesite 集成微信支付接口
    第一节:JAVA 语言的学习目标
    vector(未完)
    关于phpstorm端口63342的修改经历
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13057628.html
Copyright © 2011-2022 走看看