• 反射机制(一)


    认识Class类

    Class类(在java.lang包中,Instances of the class Classrepresent classes and interfaces in a running Javaapplication):
    在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。

    获取Class实例方式

    方法1

    在Object类中存在以下一个方法:

    public final Class<?> getClass()

    利用对象实例调用getClass()方法获得Class实例

    1 package com.fwj.classdemo;
    2 
    3 public class PersonClassDemo {
    4     public static void main(String[] args) {
    5         Person per = new Person(); 
    6         System.out.println(per.getClass().getName());
    7     }
    8 
    9 }

    方法2

    运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例
     1 package com.fwj.classdemo;
     2 
     3 public class PersonClassDemo {
     4 
     5     public static void main(String[] args) {
     6         Class<?> c = Person.class;
     7         Class<?> c2 = Integer.TYPE;
     8         System.out.println(c.getName());
     9         System.out.println(c2.getName());
    10     }
    11 }

    方法3

    使用Class类的静态方法forName(),用类的名字获取一个Class实例

    public static Class<?> forName(String className) throws ClassNotFoundException

     1 package com.fwj.classdemo;
     2 
     3 public class PersonClassDemo {
     4 
     5     public static void main(String[] args) {
     6         Class<?> c = null;
     7         try {
     8             c = Class.forName("com.fwj.classdemo.Person");
     9         } catch (ClassNotFoundException e) {
    10             // TODO Auto-generated catch block
    11             e.printStackTrace();
    12         }
    13         System.out.println(c.getName());
    14     }
    15 }

     虽然有三种方法,但是最常用的是forName(),其次就是.class形式。

    通过Class类实例化对象

    在Class的使用中实例化对象是最常用的一种操作,框架的实现原理都是依靠Class类完成的。

    实例化无参构造的类

    通常是通过关键字new进行实例化,现在通过Class完成,按照以下步骤:

       1、实例化Class对象。

       2、通过Class类中的以下方法:

    public T newInstance()throws InstantiationException,IllegalAccessException

     1 package com.fwj.classdemo;
     2 
     3 public class PersonClassDemo {
     4 
     5     public static void main(String[] args) {
     6         Class<?> c = null;
     7         try {
     8             c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
     9         } catch (ClassNotFoundException e) {
    10             // TODO Auto-generated catch block
    11             e.printStackTrace();
    12         }
    13         try {
    14             Person p = (Person)c.newInstance();//获得实例
    15             System.out.println(p);
    16         } catch (InstantiationException e) {
    17             // TODO Auto-generated catch block
    18             e.printStackTrace();19         } catch (IllegalAccessException e) {
    20             // TODO Auto-generated catch block
    21             e.printStackTrace();
    22         }
    23     }
    24 }

    如果类中不存在无参构造方法则会出现以下异常:

    java.lang.InstantiationException: com.fwj.classdemo.Person
        at java.lang.Class.newInstance0(Class.java:340)
        at java.lang.Class.newInstance(Class.java:308)
        at com.fwj.classdemo.PersonClassDemo.main(PersonClassDemo.java:14)

    实例化指定构造的类

    如果一个类中不存在无参的构造方法,则必须实例化指定的构造方法
    如果想得到一个类的构造方法,可以使用Class类中的以下方法:

    public Constructor<?>[] getConstructors()throws SecurityException

    以上方法得到全部的构造,Constructor类定义在java.lang.reflect包中,属于反射操作的包。

    取得一个构造方法之后可以,可以通过Constructor类中的以下方法进行实例化:

    public T newInstance(Object... initargs)
                  throws InstantiationException,IllegalAccessException,IllegalArgumentException,InvocationTargetException

     1 package com.fwj.classdemo;
     2 
     3 import java.lang.reflect.Constructor;
     4 
     5 public class PersonClassDemo {
     6 
     7     public static void main(String[] args) throws Exception{
     8         Class<?> c = null;
     9         Person p = null;
    10         c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
    11         Constructor<?> cons[] = c.getConstructors();//取得全部构造方法
    12         p = (Person)cons[0].newInstance("fwj",23);
    13         System.out.println(p);
    14     }
    15 }

    如果存在多个构造方法,Constructor数组中构造方法按参数由多到少放入。例如cons[0]放入参数最多的构造方法,依次降序。

    以上操作比起第一种来说,相对比较复杂,应此在开发中为了简便,建议保留无参构造方法。

  • 相关阅读:
    Spark Streaming Programming Guide
    Apache Kafka Replication Design – High level
    Apache Kafka源码分析 – Log Management
    Apache Kafka源码分析 – Broker Server
    Big Data资料汇总
    Spark 源码分析 -- task实际执行过程
    Spark源码分析 – 汇总索引
    Spark源码分析 – Shuffle
    C# Windows form application 播放小视频
    leetcode第一刷_Sudoku Solver
  • 原文地址:https://www.cnblogs.com/mingluosunshan/p/3210922.html
Copyright © 2020-2023  润新知