자바 동적 - 반사 메커니즘 학습 노트
7840 단어 자바 수필
비 동적 언어:
사용자 정의 설명:
@Target(value = {ElementType.TYPE}) //
@Retention(RetentionPolicy.RUNTIME) //
public @interface Table {
String value();
}
@Target(value = {ElementType.FIELD}) //
@Retention(RetentionPolicy.RUNTIME) //
public @interface AnnoField {
String colName();
String type();
int length();
}
테스트 클래스 정의:
@Table("student")
public class Student {
@AnnoField(colName="name",type="varchar",length=10)
private String name;
@AnnoField(colName="age",type="int",length=3)
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
반사 메커니즘 을 통 해 클래스 의 속성, 방법 과 구조 기 를 얻다
@SuppressWarnings("all")
public class TestReflection {
public static void main(String[] args) {
try {
// class
Class clazz = Class.forName("com.test.reflection.Student");
//
Field[] fs = clazz.getDeclaredFields(); // public getFields()
for(Field f : fs) {
System.out.println(f);
AnnoField field = f.getAnnotation(AnnoField.class);//
System.out.println(" :"+field.colName());
}
//
Method[] ms = clazz.getDeclaredMethods(); //
for(Method m : ms) {
System.out.println(m);
}
Method m1 = clazz.getDeclaredMethod("setName", String.class);// ,
System.out.println(m1);
//
Constructor[] cs = clazz.getDeclaredConstructors();
for(Constructor c : cs) {
System.out.println(c);
}
//
Annotation[] annos = clazz.getDeclaredAnnotations();
for(Annotation anno : annos) {
System.out.println(" "+anno);
}
}catch (Exception e) {
}
}
}
반사 메커니즘 을 통 해 클래스 생 성 및 조작 속성 과 방법
@SuppressWarnings("all")
public class TestReflection2 {
public static void main(String[] args) {
try {
// class
Class clazz = Class.forName("com.test.reflection.Student");
// API
Student stu1 = (Student) clazz.newInstance();
// API
Constructor c = clazz.getConstructor(String.class,int.class);
Student stu2 = (Student) c.newInstance(" ",12);
System.out.println(stu2.getAge());
// API
Method m1 = clazz.getMethod("setName", String.class);//
m1.invoke(stu1, " ");
System.out.println(clazz.getMethod("getName", null).invoke(stu1, null));
// API
Field f1 = clazz.getDeclaredField("age");
f1.setAccessible(true); // , 。
f1.set(stu1, 13);
System.out.println(stu1.getAge());
}catch (Exception e) {
}
}
}