Reflection

反射机制:

  1. 什么是反射机制:
    1.java的反射机制是在运行状态中,对于任何一个类都能够知道这个类的所有属性和方法,对于任何一个对象都能够调用它的任何一个属性和方法,这种能动态的获取信息以及动态调用对象的方法的功能成为反射机制。

- 反射技术:
1.通过反射技术能够使java语言实现动态语言的特征。
2.反射技术的含义:
在程序运行时动态的分析类的能力就是反射。

  • 具体来说:
    1. 在运行时可以通过类名来加载这个类:
  •    例如:加载String类:Class.forName("com.mysql.jdbc.Driver")2
    
  • 2.可以获得某个类的(元数据   例如:类名,属性,方法,父类等)
    
  •  3可以动态的调用一个对象的所有方法,包括(private)
    

- 编程语言的分类:
1.动态语言:在程序运行时,动态的改变变量的类型,为变量增加,删除属性及方法。
2.非动态语言:java本身就不是动态语言,Javascript是动态语言,所以通过反射机制能够弥补java中的缺点。

  • 反射的入口:(Class类)
  • java中有两种对象:实例对象和Class对象。
  •    1实例对象是可以通过New来创建实例
    
  •    2.Class对象不能通过new 来创建实例;
    
  • Class类的解析:
  •    1.Class 这个类代表加载到jvm中的类实例,每个类只加载一次,因此每个类只有唯一的实现,通过这个类实例可以获得关于这个类的所有元数据。
    
  • 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。
  • 2.显式装载, 通过class.forname()等方法,显式加载需要的类

- 3.类加载的动态性体现:

  •   一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现
    
  •    2. Class对象不能通过new来获得,因为它是jvm生成用来保存对应类的信息,具体说来当我们定义好一个类文件并编译成class字节码后,编译器同时为我们创建一个class 对象并将它保存在.class文件中。  
    
  •    3.基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
    
  •    4.Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。  
    
  • 如何获得Class 类实例(类对象):

  • 1.Class class=类名.class;
    
  • 2.Class class=Class.forName("String");
    
  • 3.Class class=对象.getClass();
    
  • 例如:Book book =new Book(); 获得Class类实例   Class class=book.getClass();
    
  • Class 类中的方法:
    | 返回值 | 相应的方法 |
    |-static Class -|- forName(String className);-|
    返回与带有给定字符串名的类或接口相关联的class对象。
    | Constructor | getConstructor(Class …args) |
    根据参数列表获得指定的公共的构造方法
    | Constructor [] | getConstructors() |
    返回一个数组,表示所有公共的构造方法。
    |Field | getField(String name)|
    返回一个Field对象,它反映类或接口所指定的公共成员的字段或属性
    | Field [] | getFields() |
    返回一个数组,其中包含所有可访问的公共字段。
    | Method | getMethod(String name Class …parameterTypes|
    返回指定的一个公共的方法
    |-Method [ ]-|-getMethods()-|
    返回包含所有公共的方法(包含父类和接口所声明的方法)的一个数组
    | int | getModifiers() |
    返回此类或接口以整数编码的java语言修饰符(这里返回的是整数,要想转换成String,调用Modifier.toString ()方法)
    | String | getName() |
    以String形式返回Class对象所表示的类,接口,数组类,基本类型或void 名称。
    |-Boolean-|- isArray()-|
    判断此Class类是否表示一个数组类
    | T | newInstance() |
    创建Class对象所表示类的一个新实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值