首页 > 技术文章 > Java反射

3020815dzq 2018-04-26 15:16 原文

一、Java-Reflect专题

1.Class类的使用

2.方法的反射

3.成员变量的反射

4.构造函数的反射

5.Java类加载机制

|------------------------------------------基本反射简介----------------------------------------------|

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象

能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

    JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言"。从这个观看,Perl,

PythonRuby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection

用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以

加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields

设值、或唤起其methods。

跳转百度百科查看相关概念

|-----------------------------------用于获得方法信息函数:------------------------------------------|

 Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法

 Method[] getMethods() -- 获得类的所有公共方法

 Method getDeclaredMethod(String name, Class[] params) -使用特写的参数类型,获得类声明的命名的方法

 Method[] getDeclaredMethods() -- 获取的是所有该类自己声明的方法,不问访问权限

|-----------------------------------用于获得获取成员变量:------------------------------------------|

 

Field[]  getFields()--方法获取的是所有的public的成员变量的信息

Field[]  getDeclaredFields()--获取的是该类自己声明的成员变量的信息

Field getField(String name) -- 获得命名的公共字段

Field getDeclaredField(String name) -- 获得类声明的命名的字段

|-----------------------------------用于获得构造函数的信息:------------------------------------------|

 

Constructor[]  getConstructors()--获取所有的public的构造函数

Constructor[]  getDeclaredConstructors()--得到自己声明的构造函数,推荐使用(与接入级别无关)

Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数

Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

 

==========================================================================

1.什么是Calss类

    1):在面向对象的世界里,万事万物皆对象

              Java语言中,静态成员、普通数据类型是不是对象昵?

              类是谁的对象昵?

              类是对象,类是Java.lang.Class类的实例对象。

    2): 这个对象该怎么表示那?

              There  is a class named Class   中文表示:现在有一个类,他的名字就是Class

直接上大栗子分析:

2.动态加载类
    1.Class.forName("类的全称");
    2.不仅表示了类的类类型,还代表了动态加载类
    3.请大家区分编译、运行
    4.编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
先前小栗子:
main:

Word类

解析:在上述 main中,我们去创建了两个类的实例:假设现在没有还没有Word类的时候:
            我们去运行肯定会有四个错误:找不到两个类和两个类的方法。
            那么我现在去创建一个Word类,就是上述的Word类。在运行的会怎样那。
            运行结果两个错,找不到Office类和方法。
            现在可以看出来一个问题:就是我有Word类,但是程序还不能运行。导致我不能使用任何一个类。
            这就是静态加载类:在编译时刻就需要加载所有的可能使用到的类。
            那么有什么办法能做到:我想用那个类的时候在告诉我,那个类能用,还是不能用。
            解决方案:静态加载类
 
看栗子:
首先定义一个:动态加载类----》定义两个功能类------》定义一个功能标准接口分别让两个类实现。
动态加载类:

定义一个标准接口:

定义两个类实现标准接口:方便动态加载

 
3.java获取方法信息
基本的数据类型:
例如:
Class  c1=int.class;  //int的类类型   ||  Class  c2=String.class; //String类的类类型
Class  c3=double.class;   ||  Class  c4=Double.class;  两者不同,后表示Double类的类类型
Class  c5=void.class;
void关键字 都存在类类型
3-1:Class类的基本API操作
        打印类的信息,包括类的成员函数、成员变量

 

运行结果:

4:java获取成员变量构造函数信息
    成员变量也是对象:java.lang.reflect.Field
    Field类封装了关于成员变量的操作
4-1:获取成员变量:

运行如下:

4-1:获取构造函数信息

运行如下:

五:java方法反射的基本操作
        1)如何获取某个方法
             方法的名称和方法的参数列表才能唯一决定某个方法
        2)方法反射的操作
              methood.invoke(对象,参数列表)
小栗子:

7.泛型集合反射
    1.看这样一个问题:
    假设我定义一个泛型集合:
        ArrayList<String>  list = new  ArrayList<String>();
    添加一个信息:
        list.add("a");
    2.如果向这个集合添加一个数值可以添加吗?正常情况下肯定不行。
      那么有什么办法可以实现添加那?答使用集合反射
      集合反射又是什么鬼那?
      集合反射就是,等待集合编译完成后,在进行集合操作,就是绕过编译期间。
接下来我们来看个,大栗子,你就懂了

 

 

 

 

 

 

 

 

 

 

推荐阅读