java反射
反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。
程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
Java反射框架主要提供以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
在运行时调用任意一个对象的方法
反射最重要的用途就是开发各种通用框架:
很多框架(比如Spring)都是配置化的(比如通过XML文件配置JavaBean,Action之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
举一个例子,在运用Struts 2框架的开发中我们一般会在struts.xml里去配置Action,比如:
1 <action name="login" 2 class="org.ScZyhSoft.test.action.SimpleLoginAction" 3 method="execute"> 4 <result>/shop/shop-index.jsp</result> 5 <result name="error">login.jsp</result> 6 </action>
配置文件与Action建立了一种映射关系,当View层发出请求时,请求会被StrutsPrepareAndExecuteFilter拦截,然后StrutsPrepareAndExecuteFilter会去动态地创建Action实例。
比如我们请求login.action,那么StrutsPrepareAndExecuteFilter就会去解析struts.xml文件,检索action中name为login的Action,并根据class属性创建SimpleLoginAction实例,并用invoke方法来调用execute方法,这个过程离不开反射。
反射的基本运用参考:
https://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
将反射用于简单工厂模式
简单工场模式:
1 interface Fruit{ 2 public abstract void eat(); 3 } 4 5 class Apple implements Fruit{ 6 public void eat(){ 7 System.out.println("Apple"); 8 } 9 } 10 11 class Orange implements Fruit{ 12 public void eat(){ 13 System.out.println("Orange"); 14 } 15 } 16 17 // 构造工厂类 18 // 也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了 19 class Factory{ 20 public static Fruit getInstance(String fruitName){ 21 Fruit f=null; 22 if("Apple".equals(fruitName)){ 23 f=new Apple(); 24 } 25 if("Orange".equals(fruitName)){ 26 f=new Orange(); 27 } 28 return f; 29 } 30 } 31 class hello{ 32 public static void main(String[] a){ 33 Fruit f=Factory.getInstance("Orange"); 34 f.eat(); 35 } 36 37 }
运用反射的简单工厂模式:
1 package Reflect; 2 3 interface Fruit{ 4 public abstract void eat(); 5 } 6 7 class Apple implements Fruit{ 8 public void eat(){ 9 System.out.println("Apple"); 10 } 11 } 12 13 class Orange implements Fruit{ 14 public void eat(){ 15 System.out.println("Orange"); 16 } 17 } 18 19 class Factory{ 20 public static fruit getInstance(String ClassName){ 21 Fruit f=null; 22 try{ 23 f=(Fruit)Class.forName(ClassName).newInstance(); 24 }catch (Exception e) { 25 e.printStackTrace(); 26 } 27 return f; 28 } 29 } 30 class hello{ 31 public static void main(String[] a){ 32 Fruit f=Factory.getInstance("Reflect.Apple"); 33 if(f!=null){ 34 f.eat(); 35 } 36 } 37 }