• 反射


    一、反射的定义及使用

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

      

  • 相关阅读:
    re | frida | hook windows进程
    win32 | 透明窗口实现&画一个透明背景
    re | [SWPU2019]EasiestRe
    re | [QCTF2018]babyre
    web | [CISCN2019 总决赛 Day2 Web1]Easyweb
    sql | sqlite3的sqlite_master表探究
    windows | 获取系统变量ProgramData
    【友晶科技Terasic】Avalon-MM slave 为什么 readdata 要在第二个时钟周期才有数据?
    友晶科技 Terasic SOC FPGA的板子提供的image 使用了几个核? 是CPU0还是CPU1?
    【友晶科技Terasic】 用sopc-create-header-files工具生成 FPGA 硬件地址信息 用于与linux 程序交互 generate_hps_qsys_header.sh
  • 原文地址:https://www.cnblogs.com/attentle/p/9347335.html
Copyright © 2020-2023  润新知