一.什么是java反射机制?
java反射机制事java程序开发语言的特征之一,在Java运行时环境中,对于任意一个类,都可以知道这个类有哪些属性和方法,对于任意一个对象,都可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。
二.java反射的应用
java反射机制主要应用在一些工具可视化的操作软件组件上,通过在运行动态的获取用户信息,动态的创建对象
三.JAVA反射机制提供的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判段任意一个类所具有的成员变量和方法
在运行时调用任一个对象的方法
在运行时创建新类对象
在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象
下面是实例代码和说明:
1.<wbr><wbr><wbr><span style="color:#b800">得到某个对象的属性</span><br> 1<wbr><wbr><wbr><wbr> public Object getProperty(Object owner, String fieldName) throws Exception {<br> 2<wbr><wbr><wbr><wbr> Class ownerClass = owner.getClass();<br> 3 <wbr><wbr> Field field = ownerClass.getField(fieldName);<br> 4<wbr><wbr><wbr><wbr> Object property = field.get(owner);<br> 5<wbr><wbr><wbr><wbr> return property;<br> 6<wbr><wbr><wbr> }<br> Class ownerClass = owner.getClass():得到该对象的Class。<br> Field field = ownerClass.getField(fieldName):通过Class 得到类声明的属性。<br> Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。<br> 2. <span style="color:#aa00">得到某个类的静态属性</span><br> 1<wbr><wbr><wbr><wbr> public Object getStaticProperty(String className, String fieldName)<br> 2<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> throws Exception {<br> 3<wbr><wbr><wbr><wbr> Class ownerClass = Class.forName(className);<br> 4<wbr><wbr><wbr><wbr> Field field = ownerClass.getField(fieldName);<br> 5<wbr><wbr><wbr><wbr> Object property = field.get(ownerClass);<br> 6<wbr><wbr><wbr> return property;<br> 7 }<br> Class ownerClass = Class.forName(className) :首先得到这个类的Class。<br> Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。<br> Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。<br> 3. <span style="color:#9b00">执行某对象的方法</span><br> 1<wbr><wbr><wbr><wbr> public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {<br> 2 <wbr><wbr> Class ownerClass = owner.getClass();<br> 3<wbr><wbr><wbr><wbr> Class[] argsClass = new Class[args.length];<br> 4<wbr><wbr><wbr> for (int i = 0, j = args.length; i < j; i++) {<br> 5<wbr><wbr><wbr><wbr> argsClass[i] = args[i].getClass();<br> 6<wbr><wbr><wbr> }<br> 7<wbr><wbr><wbr> Method method = ownerClass.getMethod(methodName, argsClass);<br> 8<wbr><wbr><wbr> return method.invoke(owner, args); <wbr><wbr><br> 9}<br> Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。<br> 5~9行:配置参数的Class数组,作为寻找Method的条件。<br> Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。<br> method.invoke(owner, args):执行该 Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。<br> 4. <span style="color:#a100">执行某个类的静态方法</span><br> 1<wbr><wbr><wbr><wbr> public Object invokeStaticMethod(String className, String methodName,<br> 2<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Object[] args) throws Exception {<br> 3<wbr><wbr><wbr><wbr> Class ownerClass = Class.forName(className);<br> 4<wbr><wbr><wbr> Class[] argsClass = new Class[args.length];<br> 5<wbr><wbr><wbr><wbr> for (int i = 0, j = args.length; i < j; i++) {<br> 6<wbr><wbr><wbr><wbr> argsClass[i] = args[i].getClass();<br> 7<wbr><wbr><wbr> }<br> 8<wbr><wbr><wbr><wbr> Method method = ownerClass.getMethod(methodName, argsClass); <wbr><wbr><wbr><br> 9<wbr><wbr><wbr><wbr> return method.invoke(null, args);<br> 10<wbr> }<br> 基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。<br> 5. <span style="color:#9000">新建实例</span><br> 1<wbr><wbr><wbr><wbr> public Object newInstance(String className, Object[] args) throws Exception {<br> 2<wbr><wbr><wbr><wbr> Class newoneClass = Class.forName(className);<br> 3<wbr><wbr><wbr><wbr> Class[] argsClass = new Class[args.length];<br> 4 <wbr><wbr> for (int i = 0, j = args.length; i < j; i++) {<br> 5<wbr><wbr><wbr> argsClass[i] = args[i].getClass();<br> 6<wbr> }<br> 7<wbr><wbr><wbr><wbr> Constructor cons = newoneClass.getConstructor(argsClass);<br> 8<wbr><wbr><wbr><wbr> return cons.newInstance(args); <wbr><br> 9<wbr><wbr> }<br> 这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。<br> Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。<br> 第5~第9行:得到参数的Class数组。<br> Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。<br> cons.newInstance(args):新建实例。<br> 6. <span style="color:#a100">判断是否为某个类的实例</span><br> 1<wbr> public boolean isInstance(Object obj, Class cls) {<br> 2<wbr><wbr><wbr><wbr> return cls.isInstance(obj);<br> 3 }<br> 7. <span style="color:#bd00">得到数组中的某个元素</span><br> 1<wbr> public Object getByArray(Object array, int index) {<br> 2<wbr><wbr><wbr><wbr> return Array.get(array,index);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
反射也就是说,在编译时,你获取了一个指向某个并不存在你的程序空间中的对象的引用;事实上在编译时你的程序无法获知这个对象所属的类.<wbr><wbr><br><wbr> java附带的库java.lang.reflect包含了FIeld,Method,Constructor类.这些类型的对象是由jvm在运行时创建的,用以表示未知类里对应的成员.你就可以使用Constructor创建新的对象,用get()和set()方法读取和修改与Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。他的去翻一下jdk文档吧!<wbr><wbr><br><wbr> 1、Constructor<wbr><wbr> getConstructor(Class[]<wbr><wbr> params)获得使用特殊的参数类型的公共构造函数。<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> Constructor[]<wbr><wbr> getConstructors() 获得类的所有公共构造函数<wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> Constructor<wbr><wbr> getDeclaredConstructor(Class[]<wbr><wbr> params)获得使用特定参数类型的构造函数(与接入级别无关)<wbr><wbr><wbr><wbr><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr> Constructor[]<wbr><wbr> getDeclaredConstructors() 获得类的所有构造函数(与接入级别无关)<wbr><wbr><wbr><wbr><br><wbr> 2.<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr> Field<wbr><wbr> getField(String<wbr><wbr> name)获得命名的公共字段<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr> Field[]<wbr><wbr> getFields() 获得类的所有公共字段<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr> Field<wbr><wbr> getDeclaredField(String<wbr><wbr> name)获得类声明的命名的字段<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr> Field[]<wbr><wbr> getDeclaredFields()获得类声明的所有字段<wbr><wbr><wbr><wbr><br><wbr> 3.<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr> Method<wbr><wbr> getMethod(String<wbr><wbr> name,<wbr><wbr> Class[]<wbr><wbr> params)使用特定的参数类型,获得命名的公共方法<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr> Method[]<wbr><wbr> getMethods() 获得类的所有公共方法<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr> Method<wbr><wbr> getDeclaredMethod(String<wbr><wbr> name,<wbr><wbr> Class[]<wbr><wbr> params)使用特写的参数类型,获得类声明的命名的方法<wbr><wbr><wbr><wbr><wbr><br> Method[]<wbr><wbr> getDeclaredMethods() 获得类声明的所有方法<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>