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();
    }
}

  

posted on 2019-08-25 20:52  MC伍  阅读(740)  评论(0编辑  收藏  举报