反射

1,java反射是什么

首先明确的概念: 一切皆对象----类也是对象
应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别   的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

2,java反射(Reflection)的底层实现原理

 众所周知Java有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象
而这个Class 类十分特殊。它和一般类一样继承自Object,当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。
而Class对象是java反射故事起源。Class类提供了大量的实例方法来获取该Class对象所对应的详细信息,我们只是做简单的介绍,详细请参考JDK文档,这边提供一个在线的中文文档给大家如下:

http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

这边列了下Class类其中的很少一部分方法,

获取公共构造器 getConstructors()
获取所有构造器 getDeclaredConstructors
获取包含的方法 getMethod()
获取包含的属性 getField(String name)
获取内部类 getDeclaredClasses()
获取外部类 getDeclaringClass()
获取所实现的接口 getInterfaces()
获取修饰符 getModifiers()
获取所在包 getPackage()
获取类名包含包路径  getName()
类名不包含包路径  getSimpleName()

一 反射机制的概念:

反射java语言中的一种机制,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。通过这种机制可以动态的实例化对象、读写属性、调用方法

二、反射的三大作用

 在JAVA中,只有给定类的名字,就可以通过反射机制来获取类的所有信息,可以动态的创建对象和编译。
 
 1、 实例化对象
  Constructor c = new clz.getConstructor(String.class);
   c.newInstance("哈哈");
  
   Constructor.getConstructor                  //只要能拿到oop思想能实例化就能拿到
   Constructor.getDeclaredConstructor   //只要是个构造器就能拿到
  注:提供有参构造器后一定要提供无参构造器

2、 动态调用方法

   Method m = clz.getMethod ("hello",String.class);
   m.invoke(clz.newInstanee(),"文字");
   //调用私有的方法  并且不能超过指定类型
   Method m = clz.getDeclaredMethod ("hello",String.class);
   m.invoke(clz.newInstanee(),"文字");

3、 读写属性

  Field field = clz.getField("age");
  field.set(stu,18); //赋值
  field.get(stu);   //取值

三 反射机制的应用:

 生成动态代理,面向切片编程(在调用方法的前后各加栈帧).

四、反射的原理

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

反射的实现主要借助以下四个类:

Class:类的对象
Constructor:类的构造方法
Field:类中的属性对象
Method:类中的方法对象

1、Class.forName(完整类名)

2、类名.class

3、对象.getClass()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值