一、反射的定义及使用
反射是指通过class类来获取对象的来源,而通过对象的来源可以进行一些操作(类、构造、属性、成员等)。
class类是描述整个类的概念,也是整个反射的操作源头,而在使用class类时仍然关注的是这个类的对象,类的对象有三种模式:
1、getClass方法
1 import java.util.Date; 2 public class Reflect { 3 public static void main(String[] args) { 4 Class<?> cls = new Date().getClass();//取得class对象 5 System.out.println(cls.getName()); 6 } 7 }
执行结果:
java.util.Date
2、“类.class”:直接根据具体的类来取得class类的实例化对象
1 import java.util.Date; 2 public class Reflect { 3 public static void main(String[] args) { 4 Class<?> cls = Date.class; //不需要实例化Date对象 5 System.out.println(cls.getName()); 6 } 7 }
执行结果:
java.util.Date
3、使用class类提供的方法:public static Class<?> forName(String className) throws ClassNotFoundException;(最常用)
1 public class Reflect { 2 public static void main(String[] args) throws Exception{ 3 Class<?> cls = Class.forName("java.util.Date"); //直接使用字符串描述使用的类,此时不需要导入包Date 4 System.out.println(cls.getName()); 5 } 6 }
执行结果:
java.util.Date
在以上三个方法中,除了第一个会产生Date的实例化对象外,其他两个都不会产生实例化对象,因此取得Class类对象的一个好处是:可以直接通过反射实例化对象,实现的方法为:public T newInstance() throws InstantiationException, IllegalAccessException;
1 public class Reflect { 2 public static void main(String[] args) throws Exception{ 3 Class<?> cls = Class.forName("java.util.Date"); //直接使用字符串描述使用的类,此时不需要导入包Date 4 java.lang.Object object = cls.newInstance(); //实例化对象,等价于new java.util.Date() 5 System.out.println(object); 6 } 7 }
执行结果:
Sat Jul 21 11:03:32 CST 2018
这就是第二种实例化对象的方法:通过反射进行实例化。
二、反射与工厂设计模式
若是自己编写的接口,要想取得本接口的实例化对象,最好使用工厂类来设计,实现代码如下:
1 interface IFruit{ 2 public void eat(); 3 } 4 interface IMessages { 5 public void print(); 6 } 7 class MessageImpl implements IMessages { 8 public void print(){ 9 System.out.println("Hello"); 10 } 11 } 12 class Apple implements IFruit{ 13 @Override 14 public void eat() { 15 System.out.println("Apple:吃苹果"); 16 } 17 } 18 class Factorys { 19 private Factorys(){} 20 @SuppressWarnings("uncheaked") 21 public static <T> T getInstance(String className){ 22 T obj = null; 23 try{ 24 obj = (T) Class.forName(className).newInstance(); 25 }catch (Exception e){ 26 e.printStackTrace(); 27 } 28 return obj; 29 } 30 } 31 public class Reflect { 32 public static void main(String[] args) throws Exception{ 33 IFruit fruit = Factorys.getInstance("com.lxb.vo.Apple"); 34 fruit.eat(); 35 IMessages msg = Factorys.getInstance("com.lxb.vo.MessageImpl"); 36 msg.print(); 37 } 38 }
执行结果:
Apple:吃苹果
Hello