1. 程式人生 > 實用技巧 >[Java基礎] 反射

[Java基礎] 反射

一:反射

  就是從klass裡找到該類物件在Class的映像,相關方法有:

public static void main(String[] args) throws Exception {
        //獲取位元組碼檔案
        Class<?> rName = Class.forName(全限定類名);
        
        /**
         * 獲取構造方法
         * 
         */
        //獲取___所有public的構造方法,
        //如果還要獲取所有的構造方法用getDeclaredConstructors()方法
Constructor<?>[] constructors = rName.getConstructors(); //獲取___指定的構造方法,這獲取的是無參構造方法, //要獲取有參的請在行參列表上寫上(資料型別.class,資料型別.class); Constructor<?> constructor = rName.getConstructor(); //呼叫___無參構造方法 Object newInstance = constructor.newInstance();
/** * 獲取方法 * */ //獲取___類中所有的public修飾的方法,其中包括父類的方法。 //如果還要獲取所有的方法用getDeclaredMethods()方法 Method[] methods = rName.getMethods(); //獲取___指定的方法,這獲取的是無參方法, //要獲取有參的請在行參列表上寫上(指定的方法名,資料型別1.class,資料型別2.class); Method method = rName.getMethod(方法名);
//呼叫___非static修飾的方法需要invoke(物件,實參1,實參2), //有static修飾的方法需要invoke(null,實參1,實參2)。 //我這呼叫的非static修飾方法沒有引數就只需一個物件 method.invoke(newInstance); /** * 獲取欄位 * */ //獲取___類中的public欄位。如果還要獲取所有的欄位用getDeclaredFields()方法 Field[] fields = rName.getFields(); //獲取___指定的欄位。 Field field = rName.getDeclaredField(指定的欄位名); //設定___指定的欄位,非static修飾,set(物件,值);有static修飾,set(null,值) field.set(newInstance,5.2); //呼叫___指定欄位的值,非static修飾,get(物件);有static修飾,get(null) Object object = field.get(newInstance); System.out.println("指定欄位的值=="+object); /** * 破壞包裝declaredField.setAccessible(boolean)破壞封裝,可以呼叫私有成員 * true:破環 * false:預設值,不破壞 */ Field field2 = rName.getDeclaredField(私有化的欄位名); //破壞封裝,不讓欄位私有化 field2.setAccessible(true); //設定欄位的值 field2.set(newInstance,值); //呼叫設定後的欄位值,並列印 Object object2 = field2.get(newInstance); System.out.println("破壞封裝==="+object2); //獲取全限定類名 String name = rName.getName(); System.out.println("全限定類名: "+name); //獲取類名簡寫 String simpleName = rName.getSimpleName(); System.out.println("類名簡寫: "+simpleName); } }

二:兩種設計模式粗略解釋

  1.單例模式: 分為 餓漢模式 懶漢模式

    餓漢是提前在靜態域內就建立好一個例項等著拿去使用,由於是一個static的而且無其他方法能對此進行操作所以是個安全的,且執行緒安全

    懶漢是提供一個例項方法,方法能獲取一個例項,也是唯一一個例項,因為構造方法也一樣被私有化了,只能通過這個方法獲取例項,但因為無其他保障,所以是個不安全的

  2.執行緒安全的懶漢

    1.使用雙鎖,synchronized保護方法,volatile保護例項

    2.靜態內部類

    3.列舉

  3.如何破壞單例

    1.反射

    2.克隆

    3.序列化

  4.工廠模式

    簡單的來說就是消費者和生產者之間的關係

    使用BlockingQueue能輕鬆實現個簡易的工廠模式