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