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()