zoukankan      html  css  js  c++  java
  • 认识反射机制

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

      所谓的“反”指的是根据对象来取得对象来源信息,而这个“反“的操作核心的处理在于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     
  • 相关阅读:
    浮动元素的应用
    网页中选中文字 ,复制的颜色会变化
    JVM指令重排
    JVM相关的几个基本概念
    Cygwin安装apt-cyg
    MySql四种隔离级别
    Django利用form进行显示
    Django在不启动server的情况下调用方法
    Js实现hashMap
    Js编写的菜单树
  • 原文地址:https://www.cnblogs.com/Tony98/p/10543405.html
Copyright © 2011-2022 走看看