JAVA學習第十一天

註解
反射

註解

//創建註解   必須聲明 @Target   (註解的類型 ) @Retention(註解範圍)
package com.lingzhuo.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 MyAnnotation {
    //這個叫註解
    String nameAnnotation() default "張三";
    String sexAnnotation();
    int ageAnnotation();


}

package com.lingzhuo.test;

import java.lang.reflect.Field;

public class Clazz {
    private int num;

    @MyAnnotation(ageAnnotation = 5, sexAnnotation = "男")
    private Student1 zhangsan;//成員變量 Student1爲類型 張三爲Object value
    @MyAnnotation(ageAnnotation = 5, sexAnnotation = "男", nameAnnotation = "李四")
    private Student1 lisi;
    @MyAnnotation(ageAnnotation = 5, sexAnnotation = "女", nameAnnotation = "王五")
    private Student1 wangwu;
    private Student1 zhaoliu;

    public Clazz() {
        shujie();
    }

    public void shujie() {
        // TODO Auto-generated method stub
        Class<? extends Clazz> cla = Clazz.class;// Clazz類
        Field[] fields = cla.getDeclaredFields();//得到所有的成員變量
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];//得到張三和張三的註解
            MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);//得到註解的類
            //'.'說明'.'前的有後面的屬性
            if (annotation != null) {
                try {
                    field.setAccessible(true);
                    Student1 student = new Student1();//Student1爲屬性  
                    student.setAge(annotation.ageAnnotation());
                    student.setName(annotation.nameAnnotation());
                    student.setSex(annotation.sexAnnotation());//創建一個學生  將張三的屬性給這個學生

                    field.set(this, student);//this指的是Clazz裏面的一個對象         ///////////student爲Clazz的成員變量  相當於人的年齡一樣
                    field.setAccessible(false);
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public Student1 getZhangsan() {
        return zhangsan;
    }

    public void setZhangsan(Student1 zhangsan) {
        this.zhangsan = zhangsan;
    }

    public Student1 getLisi() {
        return lisi;
    }

    public void setLisi(Student1 lisi) {
        this.lisi = lisi;
    }

    public Student1 getWangwu() {
        return wangwu;
    }

    public void setWangwu(Student1 wangwu) {
        this.wangwu = wangwu;
    }

    public Student1 getZhaoliu() {
        return zhaoliu;
    }

    public void setZhaoliu(Student1 zhaoliu) {
        this.zhaoliu = zhaoliu;
    }

}
package com.lingzhuo.test;

public class Student1 {
    private int age;
    private String name;
    private String sex;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }


}
package com.lingzhuo.test;

public class Test {
    public static void main(String[] args) {
        Clazz clazz=new  Clazz();
        System.out.println(clazz.getZhangsan().getName());
    }

}

反射

//反射
package com.lingzhuo.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Student_Test {
    public static void main(String[] args) {
        Student zhangsan = new Student();
        System.out.println(zhangsan.getAge());
        System.out.println(zhangsan.getClass());// class  com.lingzhuo.test.Student
        System.out.println(zhangsan.getClass().getName()); // com.lingzhuo.test.Student

        // Object.getClass() Class<? extends Number> c = n.getClass();

        // Class<? extends Student> clazz=zhangsan.getClass();// 返回此 Object的運行時類
        // Class<? extends Student> clazz = Student.class;
        // 與zhangsan.getClass()差不多 得到的都是

        Class<? extends Student> clazz = Student.class;// 返回此 Object 的運行時類

        // 得到無參構造器
        Constructor constructor;
        try {
            constructor = clazz.getDeclaredConstructor();
            System.out.println("得到的無參構造器:"+constructor.getName());
        } catch (NoSuchMethodException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SecurityException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        //得到有參構造器
        try {
            Class[] conArg = new Class[2];
            conArg[0] = Integer.class;
            conArg[1] = String.class;
            Constructor constructor1 = clazz.getDeclaredConstructor(conArg);
            System.out.println("得到的有參構造器:" + constructor1.toString());
            // public
            // com.lingzhuo.test.Student(java.lang.Integer,java.lang.String)
        } catch (NoSuchMethodException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SecurityException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


        // Student爲一個類

        try {
            // Class 得到所有的方法
            Method[] methods = clazz.getDeclaredMethods();
            // 返回 Method 對象的一個數組,這些對象反映此 Class
            // 對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。
            for (int i = 0; i < methods.length; i++) {
                System.out.println(methods[i].getName());// 方法名字
                // getAge
                // getSex
                // setSex
                // java.lang.String
                // getName
                // setName
                // java.lang.String
                Class[] parameter = methods[i].getParameterTypes();// 方法的類型 形參類型
                for (int j = 0; j < parameter.length; j++) {
                    System.out.println(parameter[j].getName());
                }
            }

            Field field = clazz.getDeclaredField("age");// Declared公開宣佈的
            // 指定已聲明字段(定義的變量)
            field.setAccessible(true);
            // 將此對象的 accessible 標誌設置爲指示的布爾值。值爲 true 則指示反射的對象在使用時應該取消 Java語言訪問檢查。
            // 值爲 false 則指示反射的對象應該實施 Java 語言訪問檢查。
            field.setInt(zhangsan, 30);// 將字段的值設置爲指定對象上的一個 int 值。
            field.setAccessible(false);// 記得恢復對反射對象的檢查
            System.out.println(zhangsan.getAge());
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 以聲明字段
        Field[] fields = clazz.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            System.out.println(fields[i].getName());

        }

        Constructor<?>[] constructor2 = clazz.getDeclaredConstructors();
        for (int i = 0; i < constructor2.length; i++) {
            System.out.println(constructor2[i].getName());// com.lingzhuo.test.Student
            Class[] parameter = constructor2[i].getParameterTypes();// 構造器類型
                                                                    // 一個無參的
            // 一個有參的
            for (int j = 0; j < parameter.length; j++) {
                System.out.println(parameter[j].getName());
            }
        }
        // com.lingzhuo.test.Student
        // int
        // java.lang.String
        // com.lingzhuo.test.Student

        // Class .getDeclaredConstructors()
        // 返回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的所有構造方法。

    }

}
//反射的對象
package com.lingzhuo.test;

public class Student {
    private int age = 20;
    private String name;
    private String sex;

    public Student() {

    }

    public Student(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章