內部類反射獲取實例

內部類反射獲取實例

  • 在做設計模式用例編寫的時候,發現通過 class.forName(package.外部類名$內部類名) 無法獲取到內部類的實例 會報以下錯誤,這裏做出記錄

java.lang.InstantiationException 報錯具體內容

//    java.lang.InstantiationException: com.example.demo.dp.A3FactoryMethod$ConcreteFactory2
//    at java.lang.Class.newInstance(Class.java:427)
//    at com.example.demo.dp.A3FactoryMethodTest.main(A3FactoryMethodTest.java:21)
//    Caused by: java.lang.NoSuchMethodException: com.example.demo.dp.A3FactoryMethod$ConcreteFactory2.<init>()
//    at java.lang.Class.getConstructor0(Class.java:3082)
//    at java.lang.Class.newInstance(Class.java:412)
//            ... 1 more

工廠類

package com.example.demo.dp;

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * @program: 3.工廠方法(Factory Method  [ˈfæktri; ˈfæktəri]  [ˈmeθəd])模式:定義一個用於創建產品的接口,由子類決定生產什麼產品。
 * @description:
 * @author: [email protected]
 * @create: 2020-05-07 13:42
 **/
public class A3FactoryMethod {

    //抽象產品:提供了產品的接口
    interface Product
    {
        public void show();
    }
    //具體產品1:實現抽象產品中的抽象方法
    class ConcreteProduct1 implements Product
    {
        public void show()
        {
            System.out.println("具體產品1顯示...");
        }
    }
    //具體產品2:實現抽象產品中的抽象方法
    class ConcreteProduct2 implements Product
    {
        public void show()
        {
            System.out.println("具體產品2顯示...");
        }
    }
    //抽象工廠:提供了廠品的生成方法
    interface AbstractFactory
    {
        public Product newProduct();
    }
    //具體工廠1:實現了廠品的生成方法
    class ConcreteFactory1 implements AbstractFactory
    {
        public Product newProduct()
        {
            System.out.println("具體工廠1生成-->具體產品1...");
            return new ConcreteProduct1();
        }
    }
    //具體工廠2:實現了廠品的生成方法
    class ConcreteFactory2 implements AbstractFactory
    {
        public Product newProduct()
        {
            System.out.println("具體工廠2生成-->具體產品2...");
            return new ConcreteProduct2();
        }
    }

}

測試類

package com.example.demo.dp;

//import com.example.demo.dp.A3FactoryMethod.ConcreteFactory1;
import com.example.demo.dp.A3FactoryMethod.*;

import java.lang.annotation.Native;
import java.lang.reflect.Constructor;
import java.net.URLClassLoader;

public class A3FactoryMethodTest {

    // 對於正常類的 Class.forName(package.ClassName)
    // 對於正常類的 Class.forName(package.外部類名$內部類名)
    public static void main(String[] args) {
        try {
            A3FactoryMethod demo = new A3FactoryMethod();
            Product a;
            AbstractFactory af;
            String findName = "ConcreteFactory2";

            // 這裏是內部類 的 創建方式
            Class c = A3FactoryMethod.class.forName("com.example.demo.dp.A3FactoryMethod$" + findName);
            Constructor<?> con =c.getDeclaredConstructor(A3FactoryMethod.class);
            con.setAccessible(true);
            Object obj = con.newInstance(demo);

            af = (A3FactoryMethod.AbstractFactory) obj;
            a = af.newProduct();
            a.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

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