zoukankan      html  css  js  c++  java
  • java学习笔记之反射—Class类实例化和对象的反射实例化

    java学习笔记之反射—Class类实例化和对象的反射实例化

     

           反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,
    可以采用三种方式完成。

    java.lang.Class类的定义:

    public final class Class<T>
    extends Object
    implements Serializable, GenericDeclaration, Type, AnnotatedElement, TypeDescriptor.OfField<Class<?>>, Constable   

    1.Object类支持:

    Object类可以根据实例化对象获取Class对象:public final Class<?> getClass()   

    这种方式有一个缺点:如果现在只是想获得Class类对象,则必须产生指定类对象后才可以获得,会造成一个无用的对象产生

    代码:

    Person per = new Person();//已经存在有指定类的实例化对象
    Class<? extends Person> cls = per.getClass();

    2.JVM直接支持:

    采用“类.class”的形式实例化

    代码:

    Class<? extends Person> cls2 = Person.class;

    3.Class类支持:

    在Class类里面提供有一个static方法:

    • 加载类:public static Class<?> forName​(String className) throws ClassNotFoundException

    这种模式最大的特点是可以直接采用字符串的形式定义要使用的类型,并且程序不需要编写任何的import程序

        注意:使用该方法时参数必须是完整类名,如以下代码中IOtest为包名,InputUtil是类名

    Class<?> cls3 = Class.forName("IOtest.InputUtil");

    完整代码:

    复制代码
    package Reflect;
    
    public class ReflectDemo {
    
        public static void main(String[] args) throws ClassNotFoundException {
            // TODO Auto-generated method stub
            
            // 1、Object类支持
            Person per = new Person();//已经存在有指定类的实例化对象
            Class<? extends Person> cls = per.getClass();
            System.out.println(per);
            System.out.println(cls.getName());//获取的是类的完整名称
            // 2、JVM直接支持
            Class<? extends Person> cls2 = Person.class;
            System.out.println(cls2.getName());
            // 3、Class类支持
            Class<?> cls3 = Class.forName("IOtest.InputUtil");//不需要用import导入IOtest包
            System.out.println(cls3.getName());
        }
    
    }
    class Person{}
    复制代码

           

           获取Class对象之后最大的意义实际上并不是在于这是一个对象,更重要的是Class类里面提供有一个对象的
    反射实例化方法(代替了关键字new):

    在jdk1.9以前的实例化:public T newInstance() throws InstantiationException,IllegalAccessException
    jdk1.9之后:clazz.getDeclaredConstructor().newInstance()
    通过反射实现的对象实例化处理,依然要调用类中的无参构造方法,其本质等价于“类 对象 = new 类()”,也就是说相当于隐藏了关键
    字new,而直接使用字符串进行了替代

    代码实例:

    复制代码
    /*
     * 通过newInstance()方法实例化Student类对象
     */
    package Reflect;
    
    public class ReflectDemo2 {
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            Class<?> cls = Class.forName("mldn.Student");
            Object obj = cls.newInstance();//实例化对象,jdk1.9后被废除
            System.out.println(obj);
            //jdk1.9之后:被clazz.getDeclaredConstructor().newInstance()替代
            Object o = cls.getDeclaredConstructor().newInstance();
            System.out.println(o);
        }
    }
    复制代码
     
    分类: java学习
     
     
     
    « 上一篇: java学习笔记之IO编程—对象序列化
    » 下一篇: java学习笔记之反射—反射和工厂模式
  • 相关阅读:
    MFC 时钟 计算器 日期天数计算
    test10
    test9
    iOS 防止按钮快速点击造成多次响应的避免方法
    NSBundle读取图片 plist文件和txt文件
    按指定格式的子字符串,删除和分割字符串
    python批处理入门知识点
    命令行ffmpeg批量旋转视频
    NSData转化成十六进制字符串
    xcode里面使用Memory Leaks和Instruments检测内存泄漏
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/13396736.html
Copyright © 2011-2022 走看看