자바 고급 용법 의 주해 와 반사 강의
반사 와 주 해 는 자바 에서 고급 용법 에 치 우 쳐 있 으 며,일반적으로 각종 프레임 워 크 에서 광범 위 하 게 응용 되 고 있 으 며,문장 은 간단하게 반사 와 주해 의 용법 을 소개 하 며,당신 의 업무 학습 에 어느 정도 도움 이 되 기 를 바 랍 니 다.
자바 주석
주해
자바 주석,즉 Annotation 은 자바 5 부터 도입 한 신기 술 입 니 다.
Annotation 의 역할:
4.567917.절차 자체 가 아니 라 절차 에 대해 설명 할 수 있다.
다른 프로그램(컴 파일 러 등)에서 읽 을 수 있 습 니 다Annotation 형식:
코드 에@주석 이름 으로 존재 하 는 주 해 는 Suppress Warnings(value="unchecked")와 같은 수 치 를 추가 할 수 있 습 니 다Annotation 은 안에서 사용 하나 요?
원 주해 의 역할 은 다른 주 해 를 주석 하 는 것 입 니 다.자바 는 4 개의 표준 meta-annotation 유형 을 정의 하여 다른 annotation 유형 에 대해 설명 하 는 데 사 용 됩 니 다.
이 유형 과 지원 하 는 종 류 는 자바.lang.annotation 패키지 에서 찾 을 수 있 습 니 다(@Target,@Retention,@Documented,@Inherited)
@interface 사용자 정의 주석 을 사용 할 때 자바.lang.annotation.annotation 인 터 페 이 스 를 자동 으로 계승 합 니 다.
public class Test03 {
// , ,
@Myannotation2(name = "aj",schloos = {" "})
public void test(){
}
@MyAnnotation3("")
public void test2(){
}
}
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface Myannotation2{
// , +
String name() default "";
int age() default 0;
// -1
int id() default -1;
String[] schloos() ;
}
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
String value();
}
코드 에 주 해 를 넣 는 것 은 사실 이렇게 많은 것 입 니 다.관건 은 우리 가 주 해 를 어떻게 읽 느 냐 입 니 다.이것 은 반사 가 필요 합 니 다.다음은 자바 반 사 를 중점적으로 소개 합 니 다.자바 반사
반 사 는 자바 가 동적 언어 로 여 겨 지 는 관건 이다.반사 체 제 는 프로그램 이 실행 기간 에 Reflection API 를 통 해 어떠한 내부 정 보 를 얻 을 수 있 고 임 의 대상 내부 익숙 함 과 방법 을 직접 조작 할 수 있다.
Class c = Class.forName("java.lang.String")
클래스 를 불 러 온 후 메모 리 를 쌓 는 방법 구역 에 클래스 형식의 대상(클래스 는 클래스 대상 만 있 음)이 생 겼 습 니 다.이 대상 은 완전한 클래스 의 구조 정 보 를 포함 하고 있 습 니 다.우 리 는 이 대상 을 통 해 유형의 구 조 를 볼 수 있다.이 대상 은 마치 거울 과 같 아서 이 거울 을 통 해 이런 구 조 를 볼 수 있 기 때문에 우 리 는 반사 라 고 부른다.클래스 클래스
각 클래스 의 경우 JRE 는 변 하지 않 는 Class 유형의 대상 을 보존 하고 하나의 Class 대상 은 특정한 구조 에 관 한 정 보 를 포함한다.
클래스 자체 도 클래스클래스 대상 은 시스템 구축 대상4
반사 획득 대상
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student();
System.out.println(" "+person.name);
//
Class c1 = person.getClass();
System.out.println(c1.hashCode());
// forname
Class c2 = Class.forName("reflection.Student");
System.out.println(c2.hashCode());
//
Class c3 = Student.class;
System.out.println(c3.hashCode());
//
Class c4 = c1.getSuperclass();
System.out.println(c4);
}
}
@Data
class Person{
public String name;
public int age;
}
class Student extends Person{
public Student(){
this.name = " ";
}
}
class Teacher extends Person{
public Teacher(){
this.name = " ";
}
}
반사 조작 방법,속성
public class Test03 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c1 = Class.forName("reflection.Student");
Student student = (Student) c1.newInstance();
System.out.println(student.getName());
//
Method setName = c1.getDeclaredMethod("setName", String.class);
setName.invoke(student, "zhangshan");
System.out.println(student.getName());
Student student1 = (Student) c1.newInstance();
Field name = c1.getDeclaredField("name");
// , ,setAccessible(true)
name.setAccessible(true);
name.set(student1,"lisi");
System.out.println(student1.getName());
}
}
성능 검사
public class Test04 {
public static void test01(){
User user = new User();
long startTime = System.currentTimeMillis();
for (int i = 0; i <1000000000 ; i++) {
user.getName();
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime +"ms");
}
public static void test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User();
long startTime = System.currentTimeMillis();
Class c1 = user.getClass();
Method getName = c1.getDeclaredMethod("getName", null);
for (int i = 0; i <1000000000 ; i++) {
getName.invoke(user, null);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime +"ms");
}
public static void test03() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User();
long startTime = System.currentTimeMillis();
Class c1 = user.getClass();
Method getName = c1.getDeclaredMethod("getName", null);
getName.setAccessible(true);
for (int i = 0; i <1000000000 ; i++) {
getName.invoke(user, null);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime +"ms");
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
test01();
test02();
test03();
}
}
반사 조작 주해
public class Test05 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class<?> c1 = Class.forName("reflection.Customer");
//
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation:annotations){
System.out.println(annotation);
}
//
TableAnnotation annotation = c1.getAnnotation(TableAnnotation.class);
System.out.println(annotation.value());
//
Field id = c1.getDeclaredField("id");
FiledAnnotation annotation1 = id.getAnnotation(FiledAnnotation.class);
System.out.println(annotation1.columnName());
System.out.println(annotation1.length());
System.out.println(annotation1.type());
}
}
//
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface TableAnnotation{
String value();
}
@Data
@TableAnnotation("db_customer")
class Customer {
@FiledAnnotation(columnName="id",type = "Long",length =10)
private Long id;
@FiledAnnotation(columnName="age",type = "int",length =10)
private int age;
@FiledAnnotation(columnName="name",type = "String",length =10)
private String name;
}
//
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FiledAnnotation{
String columnName();
String type();
int length();
}
총결산자바 고급 용법 의 주해 와 반사 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 주해 와 반사 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.