자바 주석 간단 설명 및 응용

11407 단어 자바자바 주석
1. 자바 에서 흔히 볼 수 있 는 주석
jdk 자체 주해:
                @Override    부모 클래스 덮어 쓰기 방법
	        @Override
	        public String name() {
		return null;
	           }

부모 클래스 의 방법 정의 에 문제 가 있 는 것 을 발견 하면 삭제 할 수 없습니다. 아직 있 는 곳 이 있 기 때 문 입 니 다.
이 인 터 페 이 스 를 호출 하면:
                @Deprecated   지 났 다
부모 클래스 의 설정 방법 이 시간 이 지 났 습 니 다:
          	@Deprecated
	        public void sing();

                @Suppvisewarnings  방법 이 시대 에 뒤떨어 진 경 고 를 무시 하 다.
테스트 클래스 가 호출 될 때 방법 이 시대 에 뒤떨어 진 경고 가 나타 납 니 다. 느낌표 를 누 르 면 무시 시간 이 지 났 습 니 다.
                @SuppressWarnings("deprecation")
	        public void sing(){
		Person p = new child();
		p.sing();
	                 }

2. 흔히 볼 수 있 는 제3자 주해:
Spring :
                @Autowired
                @Service
                @Repository
Mybatis :
 
                @InterProvider
                @UpdateProvider
          
                @Options
              
  
3. 주해 의 분류:
                -->소스 코드 주석
                주 해 는 원본 코드 에 만 존재 합 니 다. class 파일 로 컴 파일 하면 없습니다.
                -->컴 파일 시 주석
                주 해 는 원본 코드 와 class 파일 에 존재 합 니 다.
                예 를 들 어 @ Override 는 컴 파일 러 에 부모 클래스 를 덮어 쓰 는 방법 을 알려 주 고 컴 파일 합 니 다.
                -->런 타임 설명
                주 해 는 운행 단계 에서 도 작용 하여 운행 논리 에 영향 을 미친다.         
                예 를 들 어 @ Autowired 가 실 행 될 때 구성원 변 수 를 설치 합 니 다.
                원 주해: 주해 에 대한 주해
4. 사용자 정의 설명:
   설명:
      @Target({ElementType.METHOD,ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Inherited
      @Documented
      public @interface Description{//   @interface       


                                       
        String desc();//            


        String author();


        int age() default 18;//   default          


        }

    원 주석:
      //     (    、    、    、       )
      @Target({ElementType.METHOD,ElementType.TYPE})
      //       (  、   、   )
      @Retention(RetentionPolicy.RUNTIME)
      //          
      @Inherited
      //    javadoc      
      @Documented

    사용자 정의 설명 사용 하기:
      @Description(desc="zy",author="boy",age=18)
      public String eyeColor(){
           return "red";
            }
    이렇게, @ Description 주 해 는 eyeColor () 방법 에서 사용 합 니 다.
5. 해석 설명:
   클래스, 함수 또는 구성원 의 실행 시 주석 정 보 를 반사 적 으로 가 져 와 동적 제어 프로그램 
  실행 논리.
   	//1、         
		 try {
			Class c = Class.forName


("com.ann.test.child");
			//2、        (         


 Description    )
			boolean isExist = c.isAnnotationPresent


(Description.class);
			if(isExist){
				//3、      
				Description d = (Description)


c.getAnnotation(Description.class);
				System.out.println(d.value());
			}
			//4、        
			  //         
			   Method[] ms = c.getMethods();
			   for (Method m : ms) {
				   //       
				boolean isMExist = 


m.isAnnotationPresent(Description.class);
				if (isMExist) {
					//         
					Description md = 


(Description)m.getAnnotation(Description.class);
					System.out.println


(md.value());
				}
				
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		

     주해 의 계승:
          부모 클래스 에 주 해 를 추가 하고, 하위 클래스 에 있 는 주 해 를 삭제 합 니 다.
          이때 도 위의 해석 방식 으로 하위 클래스 에 대해 주석 해석 을 한다.
          이 때 아무것도 출력 하지 않 고 실행          원인 은: @Inherited 는 인터페이스 계승 에 도움 이 되 지 않 습 니 다.
          그래서 Person 을 인터페이스 가 아니 라 클래스 로 바 꿔 야 합 니 다.
          child 클래스 에서 extends 로 변경
          실행 -- > 방법 에 대한 주 해 를 인쇄 하지 않 고 클래스 의 주 해 를 출력 합 니 다.
          그래서 주 해 는 유형 상의 주해 만 계승 하고 방법 상의 주 해 는 계승 하지 않 는 다.
6. 프로젝트 실현:
수요: 대상 이 조회 할 조건 을 설정 하고 query () 를 호출 한 후 대응 하 는 sql 문 구 를 되 돌려 줍 니 다.
Filter. java 클래스: (데이터베이스 테이블 의 각 필드 에 대응)
   
   package com.zy.test;


@Table("user")
public class Filter {


   @Column("id")	
   private int id;
   
   @Column("user_name")	
   private String userName;
   
   @Column("nick_name")	
   private String nickName;
	
   @Column("age")	
   private int age;
   
   @Column("city")	
   private String city;
   
   @Column("email")	
   private String email;
   
   @Column("mobile")	
   private String mobile;




public int getId() {
	return id;
}




public void setId(int id) {
	this.id = id;
}




public String getUserName() {
	return userName;
}




public void setUserName(String userName) {
	this.userName = userName;
}




public String getNickName() {
	return nickName;
}




public void setNickName(String nickNameString) {
	this.nickName = nickNameString;
}




public int getAge() {
	return age;
}




public void setAge(int age) {
	this.age = age;
}




public String getCity() {
	return city;
}




public void setCity(String city) {
	this.city = city;
}




public String getEmail() {
	return email;
}




public void setEmail(String email) {
	this.email = email;
}




public String getMobile() {
	return mobile;
}




public void setMobile(String mobile) {
	this.mobile = mobile;
}
   
}



Test 구현 클래스: (검색 조건 을 설정 하고 query 를 sql 로 되 돌려 줍 니 다)
package com.zy.test;

public class Test {

	public static void main(String[] args) {


		Filter f1 = new Filter();
		f1.setId(10);//  id 10   
		
		Filter f2 = new Filter();
		f2.setUserName("lucy");//        lucy  


 
		
		Filter f3 = new Filter();
		f3.setEmail


("[email protected],[email protected],[email protected]");//           


   
		
		//  query    
		String sql1 = query(f1);
		String sql2 = query(f2);
		String sql3 = query(f3);
		
		System.out.println(sql1);
		System.out.println(sql2);
		System.out.println(sql3);
		
	
	}
	
	private static String query(Filter f){
		return null;
	}


}

Filter 클래스 에 @ Table 과 @ Column 두 개의 주 해 를 추가 한 후 이 두 개의 주 해 를 추가 합 니 다.
정의 하기: (여기 서 주 해 를 정의 하여 대상 을 데이터베이스 에 있 는 표 와 대응 합 니 다)
Table. java: (매개 변 수 를 표 이름 으로 설정 하고 역할 영역 을 클래스 나 인터페이스 로 설정 합 니 다)
Column. java: (매개 변 수 를 열 이름 으로 설정 하고 역할 영역 을 매개 변수 로 설정 합 니 다)
 
package com.zy.test;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {


	String value();
	
}
package com.zy.test;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {


	String value();
	
}

Test. java 에서 query () 방법의 실현: (이 필드 값 은 String 과 int 형식 이 있 으 므 로 Object 형식 으로 정의 해 야 합 니 다)
   
      
package com.zy.test;


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;




public class Test {




	public static void main(String[] args) {


		Filter f1 = new Filter();
		f1.setId(10);//  id 10   
		
		Filter f2 = new Filter();
		f2.setUserName("lucy");//      lucy   
		f2.setAge(19);
		
		Filter f3 = new Filter();
		f3.setEmail


("[email protected],[email protected],[email protected]");//           


   
		
		//  query    
		String sql1 = query(f1);
		String sql2 = query(f2);
		String sql3 = query(f3);
		
		System.out.println(sql1);
		System.out.println(sql2);
		System.out.println(sql3);
		
	
	}
	
	private static String query(Filter f){
       
		 StringBuilder sb = new StringBuilder();
	  
		 //1、   class
		 Class c = f.getClass();
		 
		 //2.       table   
		boolean exists = c.isAnnotationPresent


(Table.class); 
		if (!exists) {
			return null;
		}
		Table t = (Table)c.getAnnotation(Table.class);
		String tableName = t.value();
		sb.append("select * from ").append


(tableName).append(" where 1=1 ");
		 //       
		Field[] fArray = c.getDeclaredFields();
	    for (Field field : fArray) {
			//4.         sql
	    	//4.1      
	    	boolean fExists = field.isAnnotationPresent


(Column.class);
	    	if (!fExists) {//         
				continue;
			}
	    	Column column = (Column)field.getAnnotation


(Column.class);
	    	String columnNameString = column.value();
	    	//4.2       (      get     , 


            ,      )
	    	String filedName = field.getName();
	    	    // get          


filedName.substring(0, 1).toUpperCase(),            


  filedName.substring(1),    get  
	    	String getMethodName = "get" + 


filedName.substring(0, 1).toUpperCase() + filedName.substring(1);
	    	    //          
	    	Object fieldValue = null;
	    	try {
				Method getMethod = c.getMethod


(getMethodName);
				//             
			    fieldValue = getMethod.invoke(f);
			} catch (Exception e) {
				e.printStackTrace();
			}
	    	//  sql
	    	//             int    0 


fieldValue instanceof Integer && (Integer)fieldValue == 0,   


  
	    	if (fieldValue == null || (fieldValue instanceof 


Integer && (Integer)fieldValue == 0)) {
				continue;
			}
	    	sb.append("and ").append(filedName);
	    	if (fieldValue instanceof String) {
	    		//            ,     
	    		if (((String) fieldValue).contains(",")) 


{
					String[] value = 


((String) fieldValue).split(","); 
					sb.append("in(");
					for (String v : value) {
						sb.append


("'").append(v).append("'").append(",");
					}
					//         
					sb.deleteCharAt


(sb.length()-1);
					sb.append(")");
				}else{
					
					sb.append("=").append


("'").append(fieldValue).append("'");
				}
			}
	    	else if (fieldValue instanceof Integer) {
				sb.append("=").append


(fieldValue);
			}
		}
		 
		 return sb.toString();
		 
	}


}

현재 두 번 째 표 (Department. 자바) 가 있다 면 sql 생 성 을 위 한 방법 도 필요 합 니 다.
해당 대상 에 @ Table 과 @ Column 주석 만 추가 하면 됩 니 다.
Department.java:


package com.zy.test;


@Table("department")
public class Department {


   @Column("id")	
   private int id;
   
   @Column("name")	
   private String name;
   
   @Column("leader")	
   private String leader;
	
   @Column("number")	
   private int number;


public int getId() {
	return id;
}


public void setId(int id) {
	this.id = id;
}


public String getName() {
	return name;
}


public void setName(String name) {
	this.name = name;
}


public String getLeader() {
	return leader;
}


public void setLeader(String leader) {
	this.leader = leader;
}


public int getNumber() {
	return number;
}


public void setNumber(int number) {
	this.number = number;
}
   
   
}

query () 방법 에서 매개 변 수 를 Object 로 바 꾸 면 모든 대상 이 주 해 를 추가 하 는 데 효과 가 있 습 니 다.
	Department d = new Department();
		d.setId(1);
		d.setLeader("kkk");
		d.setNumber(111);
		System.out.println(query(d));

좋은 웹페이지 즐겨찾기