Java基礎知識——反射的使用

反射的使用

代碼示例:

public class ReflectionTest {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, ClassNotFoundException, IOException {
            //利用反射實現操作
        Class manClass = Man.class;
        //利用反射創建Man類對象
        Constructor constructor=manClass.getConstructor(String.class,int.class);
        Object object=constructor.newInstance("Roy",22);
        Man man=(Man)object;
        System.out.println(man.toString());
        //通過反射調用對象指定的屬性、方法
        Field age = manClass.getDeclaredField("age");
        age.set(man,10);
        //調用方法
        Method show = manClass.getDeclaredMethod("show");
        show.invoke(man);
//通過反射可以調用私有方法、屬性、構造器
        //調用私有構造器
        Constructor constructor1=Man.class.getDeclaredConstructor(String.class);
        constructor1.setAccessible(true);
        Man sky =(Man) constructor1.newInstance("Sky");
        System.out.println(sky);
        //調用私有屬性
        Field name = manClass.getDeclaredField("name");
        name.setAccessible(true);
        name.set(sky,"Roy");
        System.out.println(sky);
        //調用私有方法
        Method showNation = manClass.getDeclaredMethod("showNation", String.class);
        showNation.setAccessible(true);
        showNation.invoke(sky,"China");
    //獲取Class實例的方式
        //方式一:
        Class clazz=Man.class;
        System.out.println(clazz);
        //方式二:
        Man m1=new Man();
        m1.getClass();
        System.out.println(m1.getClass());
        //方式三:調用Class的靜態方法
       Class clazz1= Class.forName("cn.com.java.Man");
        System.out.println(clazz1);
        //方式四:使用類的加載器
        ClassLoader classLoader=ReflectionTest.class.getClassLoader();
        Class clazz2 = classLoader.loadClass("cn.com.java.Man");
        System.out.println(clazz2);
//使用ClassLoader加載配置文件
        Properties properties=new Properties();
     /*   //讀取配置文件方式一:
        FileInputStream fis=new FileInputStream("Day20\\jdbc.properties");
        properties.load(fis);*/
        //讀取配置文件方式二:
        ClassLoader classLoader1=ReflectionTest.class.getClassLoader();
        InputStream is=classLoader1.getResourceAsStream("jdbc1.properties");
       //默認文件位置識別在當前module的src下
         properties.load(is );
        //獲取屬性值
        String user=properties.getProperty("user");
        String password=properties.getProperty("password");
        System.out.println("user "+user+"password "+password);

    }
}

通過反射創建對應的運行時類的對象

代碼示例:

public class InstanceTest {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
        Class<Man> clazz=Man.class;
        /*調用newInstance()方法創建對應的運行時類對象
        內部調用了運行時類的空參構造器*/
        Man man = clazz.newInstance();
        System.out.println(man);
        /*
        *調用運行時類的指定結構:屬性、方法、構造器
        * */
        //獲取指定的屬性public權限
        Field field=clazz.getField("age");
        //設置當前屬性的值
        field.set(man,22);
        //獲取當前屬性的值
        int id=(int)field.get(man);
        System.out.println(id);
        //方式二:規範性操作運行時類中的指定屬性
        //獲取指定變量名的屬性private也可以
        Field name = clazz.getDeclaredField("name");
        //設置屬性可訪問
        name.setAccessible(true);
        name.set(man,"Jack");
        System.out.println(name.get(man));
        /*
        * 操作運行時類中的指定方法
        * */
        //獲取指定的某個方法參數一方法名稱,參數二形參列表
        Method show = clazz.getDeclaredMethod("showNation", String.class);
        //可訪問的權限保證可訪問
        show.setAccessible(true);
        //參數一方法的調用者,參數二給形參賦值的實參
        show.invoke(man,"China");
        //獲取靜態的方法
        Method desc = clazz.getDeclaredMethod("desc");
        desc.setAccessible(true);
        desc.invoke(Man.class);
        /*
        * 調用運行時類中指定的構造器
        * */
        //獲取指定的構造器指明構造器的參數列表
        Constructor constructor = clazz.getDeclaredConstructor(String.class);
        //保證可訪問
        constructor.setAccessible(true);
        //調用此構造器創建對象
        Object juli = constructor.newInstance("Juli");
        System.out.println(juli);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章