java反射機制-取類對象

類對象概念: 所有的類,都存在一個類對象,這個類對象用於提供類本身的信息,比如有幾種構造方法, 有多少屬性,有哪些普通方法。

一.獲取類對象有3種方式

1. Class.forName
2. Hero.class
3. new Hero().getClass()

在一個JVM中,一種類,只會有一個類對象存在。所以以上三種方式取出來的類對象,都是一樣的。

 

@Test
public void TestReflection() throws Exception {
    Class<UserServiceImpl> userServiceClass = UserServiceImpl.class;

    Class pClass1=Class.forName("com.piscn.postgre.service.impl.UserServiceImpl");  //方法1
    Class pClass2=UserServiceImpl.class;//方法2
    UserServiceImpl userService = new UserServiceImpl();
    Class pClass3=userService.getClass();       //方法3
    Method testaa = pClass3.getMethod("testaa");  //可以取得裏面的方法
    System.out.println("isSynthetic"+testaa.isSynthetic());

    Method[] methods = pClass2.getMethods();
    for (int i = 0; i < methods.length; i++) {
        System.out.println("TestReflection:"+methods[i].getName()); //打印出所有方法的名字
    }
}

更多java好文請參照:

how2j-JAVA 高級-反射機制

 

二.創建對象

與傳統的通過new 來獲取對象的方式不同 
反射機制,會先拿到***的“類對象”,然後通過類對象獲取“構造器對象” 
再通過構造器對象創建一個對象

@Test
    public void TestReflection2() throws Exception {
        Class<?> userBeanClass = Class.forName("com.piscn.postgre.bean.UserBean");

        //構造器
        Constructor constructor = userBeanClass.getConstructor();
        //通過構造器實例化對象
        UserBean userBean = (UserBean)constructor.newInstance();

        userBean.setName("2222");
        System.out.println(userBean.getClass().getName()); //取得class 名字
        System.out.println(userBean.getName());
    }

運行結果:

com.piscn.postgre.bean.UserBean
2222

 

更多java好文請參照:

how2j-JAVA 高級-反射機制

 

三.通過反射機制修改對象的屬性,

    通過反射機制操作方法

   // 只有public 屬性的屬性能變得到

        Field nameFiled = userBean.getClass().getField("name"); 
        nameFiled.set(userBean,"55555555");

   @Test
    public void TestReflection3() throws Exception {
        Class<?> userBeanClass = Class.forName("com.piscn.postgre.bean.UserBean");

        //構造器
        Constructor constructor = userBeanClass.getConstructor();
        //通過構造器實例化對象
        UserBean userBean = (UserBean)constructor.newInstance();

        userBean.setName("2222");
        Field[] fields = userBean.getClass().getFields();
        for (Field field : fields) {                                // 屬性是public的才能獲取到
            System.out.println("fields is length:"+fields.length);
            System.out.println(field.getName());
        }
        // 調用屬性
        Field nameFiled = userBean.getClass().getField("name"); 
        nameFiled.set(userBean,"Filed set name");
        System.out.println(userBean.getName());

        // 調用方法
        Method declaredMethod = userBeanClass.getDeclaredMethod("setRemark", String.class);// String.class是參數的屬性
        declaredMethod.invoke(userBean, "method set name"); //利用方法進行操作

        System.out.println(userBean.getRemark());

    }


   

更多java好文請參照:

how2j-JAVA 高級-反射機制



 

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