反射

一、反射的定义及使用

  反射是指通过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

  

原文地址:https://www.cnblogs.com/attentle/p/9347335.html