JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。
Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。
扩展资料:
JAVA中反射实例:
1、Class superClass=clazz.getSuperclass()//获取父类。
System.out.println("getSuperclass:"+superClass)。
2、Class[] interfaces=clazz.getInterfaces()//获取实现接口。
System.out.println("getInterfaces:"+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors()//构造方法。
System.out.println("getConstructors:"+cons.length)。
参考资料来源:百度百科: JAVA反射机制
Java反射机制是一个非常强大的功能,在很多大型项目比如Spring,Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。下面java课程http://www.kmbdqn.com/就从实际应用的角度出发,来应用一下Java的反射机制。
反射基础
p.s:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。
在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:
Strings="ziwenxie"
Class<?>c=s.getClass()
通过forName方法
我们也可以调用Class类的静态方法forName:
Class<?>c=Class.forName("java.lang.String")
使用.class
或者我们也可以直接使用.class:
Class<?>c=String.class
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。
首先我们在typeinfo.interfacea包下面新建一个接口A:
packagetypeinfo.interfacea
publicinterfaceA{voidf()}
接着我们在typeinfo.packageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。
1.什么是反射
反射就是在运行状态把 Java 类中的各种成分映射成相应相应的 Java 类,可以动态得获取所有的属性以及动态调用任意一个方法。
1).一段java代码在程序的运行期间会经历三个阶段:source-->class-->runtime
2).Class对象在java中用一个Class对象来表示一个java类的class阶Class对象封装了一个java类定义的成员变量、成员方法、构造方法、包名、类名等。
2.反射怎么用
1).获得java类的各个组成部分,首先需要获得代表java类的Class对象 获得Class对象有以下三种方式:
Class.forname(className) 用于做类加载
obj.getClass() 用于获得对象的类型
类名.class 用于获得指定的类型,传参用
2).反射类的构造方法,获得实例
Class clazz = 类名.class
Constuctor con = clazz.getConstructor(new Class[]{paramClazz1,paramClazz2,.....})
con.newInstance(params....)
内省
什么是内省
通过反射的方式操作JavaBean的属性,jdk提供了PropertyDescription类来操作访问JavaBean的属性,Beantils工具基于此来实现。
2.内省怎么用
1).操作一个属性
Object obj = new Object()
PropertyDescriptor pd = new PropertyDescriptor(propertyName,Class)
声明属性描述对象,一次只可描述一个属性
Method m = pd.getWriterMethod()//获取setter方法
m.invoke(obj,value)
Method m = pd.getReaderMethod()//获取getter方法
Object value = m.invoke(obj)
反射机制并没有什么神奇之处。反射与RTTI的本质区别只是检查一个类的.class文件的时机不同:
反射:.class 文件是在编译时不可获得的,所以在运行时打开和检查未知类的.class文件从而变已知。
RTTI: .class 文件是在编译时打开和检查。