• 反射和工厂模式


    Java反射

    反射就是把Java类中的各个成分映射成一个个的Java对象,即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。

    动态获取信息及动态调用对象方法的功能叫Java的反射机制。

    主要由以下的类来实现反射机制(这些类都位于java.lang.reflect包中):

    • Class类:代表一个类。 Field类:代表类的成员变量(成员变量也称为类的属性)。

    • Method类:代表类的方法。

    • Constructor类:代表类的构造方法。

    • Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

    Class类是Reflection API中的核心类,主要方法如下:

    • getName():获得类的完整名字。 getFields():获得类的public类型的属性。

    • getDeclaredFields():获得类的所有属性。

    • getMethods():获得类的public类型的方法。

    • getDeclaredMethods():获得类的所有方法。

    • getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。

    • getConstrutors():获得类的public类型的构造方法。

    • getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。

    • newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

    工厂模式

    工厂模式分为三种:

    • 简单工厂模式(Simple Factory)
    • 工厂方法模式(Factory Method)
    • 抽象工厂模式(Abstract Factory)

    简单工厂:

    interface Car {
        public void Name();
    }
    
    class Aodi implements Car {
        public void Name() {
            System.out.println("Aodi");
        }
    }
    
    class Aotuo implements Car {
        public void Name() {
            System.out.println("Aotuo");
        }
    }
    
    class Factory{
        private Factory() {}
        public static Car getInstance(String className) {
            if("Aodi".equalsIgnoreCase(className)) {
                return new Aodi();
            }else if("Aotuo".equalsIgnoreCase(className)) {
                return new Aotuo();
            }
            return null;
        }
    }
    
    public class Test {
        public static void main(String[] args) throws Exception {
            Car car = Factory.getInstance("Aodi");
            car.Name();
        }
    }
    

    引入反射机制,工厂模式:

    class Factory2 {
        private Factory2() {}
        public static Car getInstance(String className) {
            Car instance = null;
            try {
                instance = (Car) Class.forName(className).getDeclaredConstructor().newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return instance;
        }
    }
    
    public class Test2 {
        public static void main(String[] args) throws Exception {
            Car car = Factory2.getInstance("sample.Aodi");
            car.Name();
        }
    }
    

    也可以用泛型解决,抽象工厂:

    class Factory3 {
        private Factory3() {}
        @SuppressWarnings("unchecked")
        //instanceName 接口的子类   className接口的类型
        public static <T> T getInstance(String instanceName, Class<T> className ) {
            T instance = null;
            try {
                instance = (T) Class.forName(instanceName).getDeclaredConstructor().newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return instance;
        }
    }
    
    public class Test3 {
        public static void main(String[] args) throws Exception {
            Car car = Factory3.getInstance("sample.Aodi", Car.class);
            car.Name();
        }
    }
    

      

  • 相关阅读:
    Eclipse 开发过程中利用 JavaRebel 提高效率
    数字转化为大写中文
    网页变灰
    解决QQ截图无法在PS中粘贴
    ORACLE操作表时”资源正忙,需指定nowait"的解锁方法
    网页常用代码
    SQL Server 2000 删除注册的服务器
    GridView 显示序号
    读取Excel数据到DataTable
    清除SVN版本控制
  • 原文地址:https://www.cnblogs.com/jhin-wxy/p/11409307.html
Copyright © 2020-2023  润新知