认识反射机制

 

  反射指的是对象的反向处理操作,就首先需要观察一下“正”的操,在作,在默认情况下,必须要先导入一个包,才能产生类的实例化对象:

  所谓的“反”指的是根据对象来取得对象来源信息,而这个“反“的操作核心的处理在于Object类的方法

    取得Class对象:public final Class<?> getClass()

  该方法返回的是一个Class类的对象,这个Class描述的就是类。 

范例:调用getClass()方法

 1 package cn.Tony.demo;
 2 
 3 import java.util.Date;
 4 
 5 public class TestDemo{
 6     public static void main(String[] args) throws Exception {
 7         Date data=new Date();//正常来讲需要通过类才可以产生实例化对象
 8         System.out.println(data.getClass());
 9     }
10 }

  此时通过对象的取得了对象的来源,这就是“反”的本质。

  反射的世界里面它所看重的不再是一个对象,而是对象身后的组成(类,对象,成员,组成)

 

  Class类是描述整个类的概念,所有也是整个反射的操作源头,那么在使用Class类的时候需要关注的仍然是这个类的对象,而这个类的对象产生模式一共有三种。

    任何的实例化对象,都可以使用Object类中的getClass()方法取得Class类对象。

 1 package cn.Tony.demo;
 2 
 3 import java.util.Date;
 4 
 5 public class TestDemo{
 6     public static void main(String[] args) throws Exception {
 7         Class<?> cls=new Date().getClass();
 8         System.out.println(cls.getName());
 9     }
10 }

    “类.class”:直接根据某一个具体的类来取得Class类的实例化对象,

1 package cn.Tony.demo;
2 import java.util.Date;
3 public class TestDemo{
4     public static void main(String[] args) throws Exception {
5         Class<?> cls=Date.class;//不需要实例化Date类对象了
6         System.out.println(cls.getName());
7     }
8 }

    使用Class类提供的方法:public static Class<?> forName(String className)throws ClassNotFoundException

范例:使用forName()方法

1 package cn.Tony.demo;
2 public class TestDemo{
3     public static void main(String[] args) throws Exception {
4         Class<?> cls=Class.forName("java.util.Date");//不需要实例化Date类对象了
5         System.out.println(cls.getName());
6     }
7 }

  在以上的3个方法里面,发现神奇地方。除了第一种形式会产生Date类的实例化对象之外,其他两种都不会产生Date类的实例化对象。于是取得了Class类对象有一个最直接的好处:可以直接通过反射实例化对象,在我们的Class类里面定义有如下方法:public T newInstance()throws InstantiationException,IllegalAccessException

范例:反射实例化对象

1 package cn.Tony.demo;
2 public class TestDemo{
3     public static void main(String[] args) throws Exception {
4         Class<?> cls=Class.forName("java.util.Date");//不需要实例化Date类对象了
5         Object obj=cls.newInstance();
6         System.out.println(obj);
7     }
8 }

  那么现在发现除了关键字new之外,对于对象的实例化模式有了第二种做法。通过反射进行。

  取得了Class类对象就意味着取得了一个指定类的操作权

 

---恢复内容结束---

  反射指的是对象的反向处理操作,就首先需要观察一下“正”的操,在作,在默认情况下,必须要先导入一个包,才能产生类的实例化对象:

  所谓的“反”指的是根据对象来取得对象来源信息,而这个“反“的操作核心的处理在于Object类的方法

    取得Class对象:public final Class<?> getClass()

  该方法返回的是一个Class类的对象,这个Class描述的就是类。 

范例:调用getClass()方法

 1 package cn.Tony.demo;
 2 
 3 import java.util.Date;
 4 
 5 public class TestDemo{
 6     public static void main(String[] args) throws Exception {
 7         Date data=new Date();//正常来讲需要通过类才可以产生实例化对象
 8         System.out.println(data.getClass());
 9     }
10 }

  此时通过对象的取得了对象的来源,这就是“反”的本质。

  反射的世界里面它所看重的不再是一个对象,而是对象身后的组成(类,对象,成员,组成)

 

  Class类是描述整个类的概念,所有也是整个反射的操作源头,那么在使用Class类的时候需要关注的仍然是这个类的对象,而这个类的对象产生模式一共有三种。

    任何的实例化对象,都可以使用Object类中的getClass()方法取得Class类对象。

 1 package cn.Tony.demo;
 2 
 3 import java.util.Date;
 4 
 5 public class TestDemo{
 6     public static void main(String[] args) throws Exception {
 7         Class<?> cls=new Date().getClass();
 8         System.out.println(cls.getName());
 9     }
10 }

    “类.class”:直接根据某一个具体的类来取得Class类的实例化对象,

1 package cn.Tony.demo;
2 import java.util.Date;
3 public class TestDemo{
4     public static void main(String[] args) throws Exception {
5         Class<?> cls=Date.class;//不需要实例化Date类对象了
6         System.out.println(cls.getName());
7     }
8 }

    使用Class类提供的方法:public static Class<?> forName(String className)throws ClassNotFoundException

范例:使用forName()方法

1 package cn.Tony.demo;
2 public class TestDemo{
3     public static void main(String[] args) throws Exception {
4         Class<?> cls=Class.forName("java.util.Date");//不需要实例化Date类对象了
5         System.out.println(cls.getName());
6     }
7 }

  在以上的3个方法里面,发现神奇地方。除了第一种形式会产生Date类的实例化对象之外,其他两种都不会产生Date类的实例化对象。于是取得了Class类对象有一个最直接的好处:可以直接通过反射实例化对象,在我们的Class类里面定义有如下方法:public T newInstance()throws InstantiationException,IllegalAccessException

范例:反射实例化对象

1 package cn.Tony.demo;
2 public class TestDemo{
3     public static void main(String[] args) throws Exception {
4         Class<?> cls=Class.forName("java.util.Date");//不需要实例化Date类对象了
5         Object obj=cls.newInstance();
6         System.out.println(obj);
7     }
8 }

  那么现在发现除了关键字new之外,对于对象的实例化模式有了第二种做法。通过反射进行。

  取得了Class类对象就意味着取得了一个指定类的操作权

 

 1 package cn.Tony.demo;
 2 
 3 interface IFruit{
 4     public void eat();
 5 }
 6 interface IMessage{
 7     public void print();
 8 }
 9 class MessageImpl implements IMessage{
10     @Override
11     public void print() {
12         System.out.println("www.Tony.com");
13     }
14 }
15 class Apple implements IFruit{
16     @Override
17     public void eat() {
18         System.out.println("【Apple】吃苹果");
19     }
20 }
21 class Factory{
22     private Factory() {}
23     public static <T> T getInstance(String className) {
24         T obj=null;
25         try {
26             obj=(T)Class.forName(className).newInstance();
27         } catch (Exception e) {
28             // TODO Auto-generated catch block
29             e.printStackTrace();
30         }
31         return obj;
32     }
33 }
34 public class TestDemo{
35     public static void main(String[] args) throws Exception {
36         IFruit fruit=Factory.getInstance("cn.Tony.demo.Apple");
37         fruit.eat();
38         IMessage msg=Factory.getInstance("cn.Tony.demo.MessageImpl");
39         msg.print();
40     }
41 }
42     

 

posted on 2019-03-16 19:09  朽木zidiao  阅读(129)  评论(0编辑  收藏  举报

导航