反射机制

可以在运行时根据指定的类名获得类的信息。
反射机制可以用于:

  • 在运行时分析类的能力。
  • 在运行时查看对象。
  • 实现通用的数组操作代码。
  • 利用 Method 对象。

Class类

在保存Java运行时,Class类存储着每个对象所属的类型标识信息,虚拟机利用这些类型信息选择相应的方法执行。它是反射的基础。

利用反射分析类的能力

Field、 Method 和 Constructor类分别用于描述类的域、 方法和构造器。 这三个类都有一个叫做getName的方法,用来返回项目的名称。

使用invoke方法调用任意方法

Method 类中有一个 invoke 方法, 它允许调用包装在当前Method对象中的方法。

简单工厂

根据参数的不同返回不同的实例。专门定义一个类负责创建其他类的实例。

 Class c = Class.forName("Class name");//这种方法是Class类调用forName方法,通过一个类的全量限定名获得类的类型
 Object o = c.newInstance();//newInstance可以初始化一个实例
 Method method = c.getMethod("cal", int.class, int[].class);//获取cal方法
 method.invoke(o,x,args);//通过invoke调用该方法,参数第一个为实例对象,后面为具体参数值

模式结构

  • Factory(工厂):负责创建所有实实例的内部逻辑
  • Product(抽象产品):负责描述所有实例共有的的公共接口
  • ConcreteProduct(具体产品):创建某个具体的对象

例子:计算圆、正方形、矩形的面积

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import static java.lang.Math.PI;

interface Area {
    //可变长参数 至少需传递一个参数
    void cal(int x,int ...args);
}

class Rectangle implements Area {
    @Override
    public void cal(int x,int ...args) {
        System.out.println("Area="+x*args[0]);
    }
}

class Circle implements Area {
    @Override
    public void cal(int x,int ...args) {
        System.out.println("Area="+PI*x*x);
    }
}

class Square implements Area {

    @Override
    public void cal(int x,int ...args) {
        System.out.println("Area="+x*x);
    }
}

class AreaFactory {
    private String type;
    public AreaFactory(String type){
        this.type=type;
    }
    //获取面积方法 使用反射机制,通过forName方法获取类的类型,再初始化实例,使用Method对象下的getMethod方法寻找cal方法,使用invoke方法执行cal方法
    public void getArea(int x,int ...args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, ClassNotFoundException, InvocationTargetException {
        //反射机制  
        Class c = Class.forName(this.type);//这种方法是Class类调用forName方法,通过一个类的全量限定名获得类的类型
        Object o = c.newInstance();//newInstance可以初始化一个实例
        Method method = c.getMethod("cal", int.class, int[].class);//获取cal方法
        method.invoke(o,x,args);//通过invoke调用该方法,参数第一个为实例对象,后面为具体参数值
    }
}

public class FactoryPatternDemo {
    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException, InstantiationException {
        //新建一个工厂对象,调用获取面积方法; getArea()方法通过反射机制实现对不同对象的调用。

        //圆形
        AreaFactory areaOfCircle = new AreaFactory("Circle");
        areaOfCircle.getArea(1);
        //正方形
        AreaFactory areaOfSquare = new AreaFactory("Square");
        areaOfSquare.getArea(2);

        //矩形
        AreaFactory areaOfRectangle = new AreaFactory("Rectangle");
        areaOfRectangle.getArea(1,2);
    }
}
  • 参考链接

嘟嘟独立博客-Java反射机制

简单工厂模式

文章目录