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();
}
}
浙公网安备 33010602011771号