歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java反射機制實例

下面是Java常見的反射機制的實現。

/**
 * 用於反射的類
*/

public class Role {
   
    private String name = "默認的不帶參數的構造函數";
   
    private String type ="默認是public";
   
    private static Role instance  = null;
   
   
    //不帶參數的
    public Role() {
    }
   
    //帶參數的
    public Role(String name) {
        this.name = name;
    }
   
    //私有帶參數的構造函數
    private Role(String name,String type) {
        this.name = name;
        this.type = type;
    }

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

    public String getName() {
        return name;
    }
   
    @Override
    public String toString() {
        System.out.println(getName()+":"+getType());
        return this.getName();
    }
   
    public synchronized static Role getInstance() {
        if(instance == null) {
            instance = new Role("帶參數的","俺是private");
        }
        return instance;
    }

    public String getType() {
        return type;
    }

    private void setType(String type) {
        this.type = type;
    }
 }

 

 

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

public class RefletTest {

    /**
    * @param args
    * @throws ClassNotFoundException
    * @throws IllegalAccessException
    * @throws InstantiationException
    */
    public static void main(String[] args) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        // 反射例子1
        System.out.println();
        System.out.println("==========反射例子之1==========");
        Class<Role> cls1 = Role.class;
        // 只能反射默認的構造函數
        Role role1 = cls1.newInstance();
        role1.toString();

        // 反射的例子2
        System.out.println();
        System.out.println("==========反射例子之2==========");
        Class<Role> cls2 = (Class<Role>) Class.forName("nc.model.reflect.Role");
        // 只能反射默認的構造函數
        Role role2 = cls2.newInstance();
        role2.toString();

        // 反射的例子3 獲取類的構造器
        /**
        * public Constructor<?>[] getConstructors()
        * 返回類中所有的public構造器集合,默認構造器的下標為0 public Constructor<T>
        * getConstructor(Class<?>... parameterTypes) 返回指定public構造器,參數為構造器參數類型集合
        * public Constructor<?>[] getDeclaredConstructors() 返回類中所有的構造器,包括私有
        * public Constructor<T> getDeclaredConstructor(Class<?>...
        * parameterTypes) 返回任意指定的構造器
        */
        System.out.println();
        System.out.println("==========反射例子之3==========");
        // 先看看public
        try {
            Constructor<Role> constructor1 = cls2
                    .getConstructor(new Class[] { String.class });
            Role role3 = constructor1.newInstance("public型的帶參數的");
            role3.toString();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        System.out.println();
        System.out.println("==========反射例子之4==========");
        Constructor<Role> constructor2;
        Role role4 = null;
        try {
            constructor2 = cls2.getDeclaredConstructor(new Class[] { //只能使用getDecalredConstructor方法,而不能使用getConstructor
                    String.class, String.class });
            constructor2.setAccessible(true);// 設置訪問權限,私有時,必須設
            role4 = constructor2.newInstance("帶參數的", "private型的");
            role4.toString();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 反射例子5 獲取類的成員變量
        /**
        *   了解了構造器,其實你可以猜到成員變量的獲取方法了,成員變量用Field類進行封裝。 主要的方法非常的類似: public Field
        * getDeclaredField(String name) 獲取任意指定名字的成員 public Field[]
        * getDeclaredFields() 獲取所有的成員變量 public Field getField(String name)
        * 獲取任意public成員變量 public Field[] getFields() 獲取所有的public成員變量
        */
        try {
            Field field1 = cls2.getDeclaredField("type");// 參數是字段名
            field1.setAccessible(true);
            Object object1 = field1.get(role2);// 參數是實例化的類
            Object object2 = field1.get(role4);// 參數是實例化的類
            System.out.println("=========反射例子之5===========");
            System.out.println(object1);
            System.out.println(object2);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 反射例子6 方法 --方法
        /**
        * public Method[] getMethods() 獲取所有的公有方法的集合 public Method
        * getMethod(String name,Class<?>... parameterTypes) 獲取指定公有方法 參數1:方法名
        * 參數2:參數類型集合 public Method[] getDeclaredMethods() 獲取所有的方法 public Method
        * getDeclaredMethod(String name,Class<?>... parameterTypes) 獲取任意指定方法
        * 無參的時候我們只要傳null就行了。
        */
        try {
            Method method1 = cls2.getDeclaredMethod("setName",
                    new Class[] { String.class });
            method1.setAccessible(true);
            method1.invoke(role2, "私有的我也可以用");
            Method method2 = cls2.getMethod("getName", null);
            Object invoke = method2.invoke(role2, null);//非靜態方法第一個參數 不能為空
            System.out.println("==========反射例子之6==========");
            System.out.println(invoke);

        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }// 無參的時候我們只要傳null就行了。
        catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 反射例子7 方法 --靜態方法和字段,
        Method method3;
        try {
            method3 = cls2.getDeclaredMethod("getInstance",
                    null);
            method3.setAccessible(true);
            Object invoke = method3.invoke(null, null);//記住與普通方法不同,第一個參數是null(不過貌似不為空,好像也沒事)
            if(invoke instanceof Role) {
                System.out.println("實例化成功");
            }
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
       
        //內部類神馬的 ---後續加上
    }

}

大話設計模式(帶目錄完整版) PDF+源代碼 http://www.linuxidc.com/Linux/2014-08/105152.htm

Java中介者設計模式 http://www.linuxidc.com/Linux/2014-07/104319.htm

Java 設計模式之模板方法開發中應用 http://www.linuxidc.com/Linux/2014-07/104318.htm

設計模式之 Java 中的單例模式(Singleton) http://www.linuxidc.com/Linux/2014-06/103542.htm

Copyright © Linux教程網 All Rights Reserved