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)
简单工厂:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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(); } } |
引入反射机制,工厂模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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(); } } |
也可以用泛型解决,抽象工厂:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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(); } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步