欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java反射筆記-創(chuàng)新互聯(lián)

Java反射筆記
  • Java反射
    • 反射概述
    • 獲取Class類的對象
    • 反射獲取構(gòu)造方法并使用
    • 反射獲取成員變量并使用
    • 反射獲取成員方法并使用
    • 反射獲取注解
  • 反射練習(xí)
    • 需求一:創(chuàng)建一個集合泛型為Integer,添加一個字符串元素
    • 需求二:通過配置文件運(yùn)行類中的指定方法
    • 需求三,使用注解替代配置文件

在上一篇 Java注解筆記中,我們簡單了解了Java注解。但是,注解到底如何工作我們還不清楚,在學(xué)習(xí)了反射之后,我們就可以讓注解做很多事情了

創(chuàng)新互聯(lián)建站專注于網(wǎng)站建設(shè)|網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計與制作經(jīng)驗,為許多企業(yè)提供了網(wǎng)站定制設(shè)計服務(wù),案例作品覆蓋墻體彩繪等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身定制品質(zhì)網(wǎng)站。Java反射 反射概述

Java反射機(jī)制:是指在運(yùn)行時去獲取一個類的變量和方法信息,然后通過獲取到的信息來創(chuàng)建對象,調(diào)用方法的一種機(jī)制。由于這種動態(tài)性,可以極大的增強(qiáng)程序的靈活性,程序不用在編譯期就完成確定,在運(yùn)行期仍然可以擴(kuò)展。

獲取Class類的對象

我們要想通過反射去使用一個類,首先我們要獲取到該類的字節(jié)碼文件對象,也就是類型為Class類型的對象

這里我們介紹三種方式獲取Class類型的對象

  • 使用類的class屬性來獲取該類對應(yīng)的Class對象
  • 調(diào)用對象的getClass()方法,返回該對象所屬類對應(yīng)的Class對象
    • 該方法是Object類中的方法,所有的Java對象都可以調(diào)用該方法
  • 使用Class類中的靜態(tài)方法forName(String className),該方法需要傳入字符串參數(shù),該字符串參數(shù)的值是某個類的全路徑,也就是完整包名的路徑

Student類

public class Student {private String name;
    int age;
    public String address;

    public Student() {}
    private Student(String name) {this.name = name;
    }

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

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

    private void function() {System.out.println("function");
    }

    public void method1 () {System.out.println("method");
    }

    public void method2 (String s) {System.out.println("method" + s);
    }
    public String method3 (String s, int i) {return s + "," + i;
    }

    @Override
    public String toString() {return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

測試反射類

public class ReflectTest {public static void main(String[] args) throws ClassNotFoundException {// 使用類的class屬性來獲取該類對應(yīng)的Class對象
        Classc1 = Student.class;
        Classc2 = Student.class;
        System.out.println(c1);
        System.out.println(c1 == c2);// true

        System.out.println("==========");

        // 調(diào)用對象的getClass()方法,返回該對象所屬類對應(yīng)的Class對象
        Student s = new Student();
        Classc3 = s.getClass();
        System.out.println(c1 == c3);// true

        System.out.println("==========");

        // 使用Class類中的靜態(tài)方法forName(String className)
        Classc4 = Class.forName("com.example.fanshe.Student");
        System.out.println(c1 == c4);// true
    }
}
反射獲取構(gòu)造方法并使用
  • 調(diào)用Class類的getConstructors()方法,該方法返回所有公共構(gòu)造函數(shù)數(shù)組
public class ReflectTest {public static void main(String[] args) {// 得到Student類的字節(jié)碼文件對象
        ClassstudentClass = Student.class;
        Constructor[] constructors = studentClass.getConstructors();
        for (Constructorcon : constructors) {System.out.println(con);
        }
    }
}
  • 調(diào)用Class類的getDeclaredConstructors()方法,該方法返回所有構(gòu)造函數(shù)數(shù)組
public class ReflectTest {public static void main(String[] args) {// 得到Student類的字節(jié)碼文件對象
        ClassstudentClass = Student.class;
        Constructor[] constructors = studentClass.getDeclaredConstructors();
        for (Constructorcon : constructors) {System.out.println(con);
        }
    }
}
  • 調(diào)用Class類的getConstructor()方法,該方法返回指定公共構(gòu)造函數(shù)
public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException,
            InvocationTargetException, InstantiationException, IllegalAccessException {// 得到Student類的字節(jié)碼文件對象
        ClassstudentClass = Student.class;
        // 拿到無參公共構(gòu)造方法
        Constructorconstructor = studentClass.getConstructor();
        // 使用反射方式創(chuàng)建對象
        Student student = constructor.newInstance();
        System.out.println(student);
    }
}
public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException,
            InvocationTargetException, InstantiationException, IllegalAccessException {ClassstudentClass = Student.class;
        // 拿到無參公共構(gòu)造方法
        //Constructorconstructor = studentClass.getConstructor();
        // 拿到3個參數(shù)的構(gòu)造方法
        Constructorconstructor = studentClass.getConstructor(String.class,
                int.class, String.class);
        // 使用反射方式創(chuàng)建對象
        Student student = constructor.newInstance("小米", 19, "廣東");
        System.out.println(student);
    }
}
  1. 基本數(shù)據(jù)類型同樣可以通過class屬性得到對應(yīng)的Class類型

  2. newInstance()方法:創(chuàng)建反射類對應(yīng)的類的實(shí)例

  • 調(diào)用Class類的getDeclaredConstructor()方法,該方法返回指定構(gòu)造函數(shù)
public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException,
            InvocationTargetException, InstantiationException, IllegalAccessException {// 得到Student類的字節(jié)碼文件對象
        ClassstudentClass = Student.class;
        // 拿到指定構(gòu)造函數(shù)
        Constructorconstructor = studentClass.getDeclaredConstructor(String.class);
        // 取消訪問檢查,以便使用私有構(gòu)造方法創(chuàng)建對象
        constructor.setAccessible(true);
        Student student = constructor.newInstance("小米");
        System.out.println(student);
    }
}
public void setAccessible(boolean flag)

這個方法用于取消訪問檢查,暴力反射機(jī)制

  • 參數(shù)說明
  1. flag:值為true時取消訪問檢查,值為false時,不取消
反射獲取成員變量并使用
Class類方法說明
public Field[] getFields()返回所有公共字段數(shù)組
public Field[] getDeclaredFields()返回所有字段數(shù)組
public Field getField(String name)返回指定公共字段
public Field getDeclaredField(String name)返回指定字段
public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException,
            InvocationTargetException, InstantiationException,
            IllegalAccessException, NoSuchFieldException {// 得到Student的字節(jié)碼對象
        ClassstudentClass = Student.class;
        // 得到address字段
        Field addressField = studentClass.getDeclaredField("address");
        // 得到name字段
        Field nameField = studentClass.getDeclaredField("name");
        // 得到無參構(gòu)造方法
        Constructorconstructor = studentClass.getConstructor();
        // 創(chuàng)建對象
        Student student = constructor.newInstance();
        // 取消訪問檢查
        nameField.setAccessible(true);
        // 為字段設(shè)置值
        addressField.set(student, "西安");
        nameField.set(student, "小米");
        // 打印
        System.out.println(student);
    }
}
public void set(Object obj, Object value)

為字段設(shè)置值

參數(shù)說明:

  1. obj:為要為哪個對象設(shè)置值
  2. value:值是多少
反射獲取成員方法并使用
Class類方法說明
public Method[] getMethods()返回所有公共方法數(shù)組(包含繼承過來的)
public Method[] getDeclaredMethods()返回所有方法數(shù)組(不包含繼承的)
public Method getMethod(String name, Class… parameterTypes)返回指定的公共方法
public Method getDeclaredMethod(String name, Class… parameterTypes)返回指定的方法
public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException,
            InvocationTargetException, InstantiationException,
            IllegalAccessException {// 得到Student的字節(jié)碼對象
        ClassstudentClass = Student.class;
        // 得到method1方法
        Method method = studentClass.getDeclaredMethod("method1");
        // 得到method2方法
        Method method2 = studentClass.getMethod("method2", String.class);
        // 得到method3方法
        Method method3 = studentClass.getMethod("method3", String.class, int.class);
        // 得到function方法
        Method function = studentClass.getDeclaredMethod("function");
        // 得到公共的無參構(gòu)造方法
        Constructorconstructor = studentClass.getConstructor();
        Student student = constructor.newInstance();
        // 調(diào)用方法
        method.invoke(student);
        method2.invoke(student, "s");
        Object s = method3.invoke(student, "s", 1);
        System.out.println(s);
        function.setAccessible(true);
        function.invoke(student);
    }
}
public Object invoke(Object obj, Object... args)

調(diào)用方法

參數(shù)說明:

  1. obj:調(diào)用方法的對象
  2. args:方法的形參
反射獲取注解
Class類方法說明
public< A extends Annotation >A getAnnotation(Class< A >annotationClass)獲取指定的注解信息
反射練習(xí) 需求一:創(chuàng)建一個集合泛型為Integer,添加一個字符串元素
public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException,
            InvocationTargetException, InstantiationException,
            IllegalAccessException, NoSuchFieldException {ArrayListarrays = new ArrayList<>();

        ClassaClass = arrays.getClass();

        Method add = aClass.getMethod("add", Object.class);

        add.invoke(arrays, "word");
        System.out.println(arrays);
    }
}
需求二:通過配置文件運(yùn)行類中的指定方法
public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException,
            InvocationTargetException, InstantiationException,
            IllegalAccessException, ClassNotFoundException, IOException {// 加載數(shù)據(jù)
        Properties prop = new Properties();
        FileReader fr = new FileReader("src\\main\\java\\com\\example\\fanshe\\class.properties");
        prop.load(fr);
        fr.close();

        String className = prop.getProperty("className");
        String methodName = prop.getProperty("methodName");

        // 得到字節(jié)碼文件對象
        ClassaClass = Class.forName(className);
        // 得到無參構(gòu)造方法
        Constructorconstructor = aClass.getConstructor();
        // 創(chuàng)建對象
        Object o = constructor.newInstance();
        // 得到method1方法
        Method method1 = aClass.getMethod(methodName);
        // 調(diào)用方法
        method1.invoke(o);
    }
}

class.properties文件如下:

className=com.example.fanshe.Student
methodName=method1
需求三,使用注解替代配置文件
@MyAnnotation(className = "com.example.fanshe.Student",methodName = "method1")
public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException,
            InvocationTargetException, InstantiationException,
            IllegalAccessException, ClassNotFoundException, IOException {// 通過注解來運(yùn)行指定類中的指定方法
        ClassreflectTestClass = ReflectTest.class;
        MyAnnotation annotation = reflectTestClass.getAnnotation(MyAnnotation.class);
        String className = annotation.className();
        String methodName = annotation.methodName();

        // 得到字節(jié)碼文件對象
        ClassaClass = Class.forName(className);
        // 得到無參構(gòu)造方法
        Constructorconstructor = aClass.getConstructor();
        // 創(chuàng)建對象
        Object o = constructor.newInstance();
        // 得到method1方法
        Method method1 = aClass.getMethod(methodName);
        // 調(diào)用方法
        method1.invoke(o);
    }
}

注解定義如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {String className();
    String methodName();
}

這就是框架常用到的技術(shù)了,后期在談到框架時我們在深入討論,那么今天就先到這里了

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站題目:java反射筆記-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://chinadenli.net/article20/dgghjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、外貿(mào)建站虛擬主機(jī)、標(biāo)簽優(yōu)化、網(wǎng)站營銷網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)