JAVA高級用法——反射(一)

8157 ワード

引用:ここでは、工場モードとインタフェースを組み合わせて、反射に対する理解を記録する.コードとテキストの部分はネットワークに由来します.それを再整理した.反射メカニズムは一般の開発者にとって、意味は大きくなく、一般的にはいくつかのシステムのアーキテクチャ設計として使用されており、今後学習するオープンソースフレームワークを含め、ほとんどが反射メカニズムを使用している.
はんしゃ概念
  • 反射後の「逆」は、「正」に対するものである.何が正しいの?クラスを使用してオブジェクトを構築するプロセスです.クラス-->オブジェクト;したがって、「逆」は、オブジェクト-->クラスです.
  • package reflection;
    class Apple
    {
    }
    public class Demo
    {
        public static void main(String[] args) throws Exception
        {
            Apple a = new Apple(); //    
            System.out.println(a.getClass().getName());//    
        }
    }
  • のインバース操作は、getClass()メソッドを使用することによって、オブジェクトが存在する「package.Class」を取得し、Classクラスオブジェクトを返します.これがすべての反射メカニズムの根源です.

  • クラスを取得する3つの方法
  • ObjectクラスのgetClass()メソッドを介して、このメソッドを使用することはめったにありません:
  • package reflection;
    class Apple
    {
    }
    public class Demo
    {
        public static void main(String[] args) throws Exception
        {
            Apple a = new Apple(); //    
            System.out.println(a.getClass().getName());//    
        }
    }
  • 「クラス.class」を使用してClassオブジェクトを取得:
  • package reflection;
    class Apple
    {
    }
    public class Demo
    {
        public static void main(String[] args) throws Exception
        {
            Class c = Apple.class;
            System.out.println(cls.getName());
        }
    }
  • Classクラスの内部定義を使用したstaticメソッド:
  • package reflection;
    class Apple
    {
    }
    public class Demo
    {
        public static void main(String[] args) throws Exception
        {
            Class cls = Class.forName("reflection.Apple");
            System.out.println(cls.getName());
        }
    }
  • 反射によるオブジェクトのインスタンス化:
  • package reflection;
    class Apple
    {
        @Override public String toString()
        {
            return "eating an apple...";
        }
    }
    
    public class Demo
    {
        public static void main(String[] args) throws Exception
        {
            Class cls = Class.forName("reflection.Apple");
            Object obj = cls.newInstance(); //     ,      new    
            Apple a = (Apple) obj;//    
            System.out.println(obj); 
        }
    }

    適用中の反射
  • 「オブジェクトを反射する」セクションでは、オブジェクトのインスタンス化操作についてnewキーワードのほかに、反射メカニズム操作が1つ増え、複雑さが増していますが、何の役に立ちますか?プログラムの開発モデルでは,結合をできるだけ減らすことが求められてきたが,結合を減らす最善の方法はインタフェースを用いることであるが,インタフェースを用いてもキーワードnewは避けられない.だからnewは結合をもたらす鍵です.しかし,反射機構とインタフェースによりnewによる結合を回避できる.
  • 原版工場設計モード
  • package reflection;
    interface Fruit
    {
        public void eat();
    }
    
    class Apple implement Fruit
    {
        public void eat()
        {
            System.out.println("eating an apple...");
        }
    }
    
    class Factory
    {
        public static Fruit getInstance(String className)
        {
            if("Apple".equals(className))
            {
                return new Apple();
            }
            return null;
        }
    }
    
    public class FactoryDemo
    {
        public static void main(String[] args)
        {
            Fruit f = Factory.getInstance("Apple");
            f.eat();
        }
    }
    /**
      *             ,            :            
      *  ,  Factory       ,        Factory getInstance  
      *   new,        ,        。
      */
  • 反射メカニズムのファクトリクラスを使用し、ここでは3番目のClassオブジェクトを取得する方法を使用します.
  • package reflection;
    interface Fruit
    {
        public void eat();
    }
    
    class Apple implement Fruit
    {
        public void eat()
        {
            System.out.println("eating an apple...");
        }
    }
    
    class Orange implement Fruit
    {
        public void eat()
        {
            System.out.println("eating an orange...");
        }
    }
    class Factory
    {
        public static Fruit getInstance(String className)
        {
            Fruit temp = null;
            try
            {
                temp = (Fruit)Class.forName(className).newInstance();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            return temp;
        }
    }
    
    public class FactoryDemo
    {
        public static void main(String[] args)
        {
            Fruit apple = Factory.getInstance("reflection.Apple");
            apple.eat();
            Fruit orange = Factory.getInstance("reflection.Orange");
            orange.eat();
        }
    }
    /**
      *              ,      Factory ,      
      */