JavaSE---反射(未完待续)

1、概述

    1.1  Java程序中许多对象在运行时会出现2种类型:编译时类型、运行时类型;

        eg:Person  person=new Student();  这行代码在编译时为Person类型,运行时为Student类型;

        eg:程序在运行时接受到外部传来的一个参数,编译时为Object类型,运行时又需要调用具体的运行时类型;

        【解决以上问题】:

           1.1.1  假设编译时类型、运行时类型都已知,可以用instanceof运算符进行判断,再利用强制类型转换为运行时类型;

           1.1.2  若编译时无法 得知该对象的类型,程序只能靠   反射   来 获取运行时的具体类型信息;

    1.2  【>>>获得Class对象<<<】

          ====每个类被加载后,在内存中都会创建一个该类的Class对象,通过Class对象就可以获得该类;

          1.1.1  调用Class对象的forName(),返回该类的Class对象  public static Class<?> forName(String className)

                className:类的全限定名

          1.1.2  调用某个类的class属性,将返回该类的Class对象; 

          1.1.3  调用某个类的getClass(),将返回该类的Class对象;

    1.3  【>>>从Class对象中获取信息<<<】   

          1.1.1  访问Class对应类包含的构造器

                                         

          1.1.2   访问Class对应类包含的方法

                                        

          1.1.3  访问Class对应类包含的属性

                                       

          1.1.4  访问Class对应类上的注解

                                  

          1.1.5  访问Class对应类包含的内部类

                                   

          1.1.6  访问Class对应类包含的外部类

                                     

          1.1.7  访问Class对应类所继承的父类、实现的接口

                                   

          1.1.8  判断Class对应类是接口、注解、枚举等

                   

     1.4  【使用反射生成并操作对象】

          1.1.1  创建对象

                调用Class对象的newInstance()  public T newInstance()  

                    此方法要求该Class对象对应的类有默认构造器,newInstance()实际上就是调用默认构造器创建实例;

package com.exiuge.mytest.reflect;

import java.lang.reflect.Constructor;

public class Test {

    public static void main(String[] args)throws Exception{
        Class clazz=Class.forName("com.exiuge.mytest.reflect.User");
        User user=(User) clazz.newInstance();

    }
}

                先获取Class对象的指定构造器Constructor对象,再调用Constructor对象的newInstance()来获得实例

package com.exiuge.mytest.reflect;

import java.lang.reflect.Constructor;

public class Test {

    public static void main(String[] args)throws Exception{
        Class clazz=Class.forName("com.exiuge.mytest.reflect.User");
        Constructor constructor =clazz.getConstructor();
        User user=(User) constructor.newInstance();
    }
}

          1.1.2  调用方法

                获取Class对象后,可获取Method对象来进行方法调用,Method对象有一个方法

                  public Object invoke(Object obj, Object... args)

          1.1.3  访问属性值

          1.1.4  操作数组

                    

猜你喜欢

转载自www.cnblogs.com/anpeiyong/p/10428556.html
今日推荐