Reflect就是Java为了弥补不能动态改变程序结构、变量类型而搞出来的一个伪动态机制,可以在运行的时候才去获取一个类,而这个类在编译的时候并不知道其名字或结构。怎么理解呢?咱们来看例子
【案例1】通过一个对象获得完整的包名和类名
package Reflect; /** * 通过一个对象获得完整的包名和类名 * */ class Demo{ //other codes... } class hello{ public static void main(String[] args) { Demo demo=new Demo(); System.out.println(demo.getClass().getName()); } }
【运行结果】:Reflect.Demo
【案例2】实例化Class类对象
package Reflect; class Demo{ //other codes... } class hello{ public static void main(String[] args) { Class<?> demo1=null; Class<?> demo2=null; Class<?> demo3=null; try{ //一般尽量采用这种形式 demo1=Class.forName("Reflect.Demo"); }catch(Exception e){ e.printStackTrace(); } demo2=new Demo().getClass(); demo3=Demo.class; System.out.println("类名称 "+demo1.getName()); System.out.println("类名称 "+demo2.getName()); System.out.println("类名称 "+demo3.getName()); } }
【运行结果】:
类名称 Reflect.Demo
类名称 Reflect.Demo
类名称 Reflect.Demo
这样我们就得到了Class对象。接下来看看我们可以用这个Class做什么
【案例3】通过Class实例化其他类对象
这里我们先构造一个Person类,之后都会用到这个类作演示,就不再贴它的代码了。
package Reflect; import java.lang.reflect.Constructor; class Person{ public Person() { } public Person(String name){ this.name=name; } public Person(int age){ this.age=age; } public Person(String name, int age) { this.age=age; this.name=name; } @Override public String toString(){ return "["+this.name+" "+this.age+"]"; } public String name; public int age; }
紧接着主函数无参实例化Person类
class hello{ public static void main(String[] args) { Class<?> demo=null; try{ demo=Class.forName("Reflect.Person"); }catch (Exception e) { e.printStackTrace(); } Person per=null; try { //无参实例化 per=(Person)demo.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } per.name="Jack"; per.age=20; System.out.println(per); } }
【运行结果】:
[Jack 20]
到这里大家应该有所感觉了。没错,这里是无参实例化,当Person这个类本身只有带参数的构造函数的时候,这样做会抛出异常,那么我们当然会猜测,newInstance()可不可以带参实例化?答案是肯定的,我们能想到,Sun的天才们肯定也能想到。唯一的问题是,事先我们可能并不知道Class有什么构造函数。代码奉上:
class hello{ public static void main(String[] args) { Class<?> demo=null; try{ demo=Class.forName("Reflect.Person"); }catch (Exception e) { e.printStackTrace(); } Person per1=null; Person per2=null; Person per3=null; Person per4=null; //取得全部的构造函数 Constructor<?> cons[]=demo.getConstructors(); //这里硬编码了,不可取 try{ per1=(Person)cons[3].newInstance(); per2=(Person)cons[2].newInstance("Jack"); per3=(Person)cons[1].newInstance(20); per4=(Person)cons[0].newInstance("Jack",20); }catch(Exception e){ e.printStackTrace(); } System.out.println(per1); System.out.println(per2); System.out.println(per3); System.out.println(per4); } }
【运行结果】:
[Jack 20]
[null 20]
[Jack 0]
[null 0]
需要注意的是,获取的构造函数数组是倒序的,第一个构造函数在最后。
那么如果我们对构造函数一无所知,怎么办?也有办法,Java提供了获取特定构造函数及其参数类型的方法。
try { //无对应构造函数会抛出NoSuchMethodException异常 Constructor cot1 = demo.getConstructor(String.class); Constructor cot2 = demo.getConstructor(new Class[]{String.class}); Constructor cot3 = demo.getConstructor(int.class); Constructor cot4 = demo.getConstructor(String.class,int.class); Class[] parameterTypes = cot2.getParameterTypes(); per1 = (Person)cot1.newInstance("Jacky Chen"); per2 = (Person)cot2.newInstance("Jacky"); per3 = (Person)cot3.newInstance(20); per4 = (Person)cot4.newInstance("Jacky", 20); } catch (NoSuchMethodException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println(per1); System.out.println(per2); System.out.println(per3); System.out.println(per4);
【运行结果】:
[Jacky Chen 0]
[Jacky 0]
[null 20]
[Jacky 20]
好了,我们现在已经可以动态实例化一个类。我们还可以做什么,比如,能不能获取类实现的接口?
【案例4】获取类实现的接口
首先定义一个接口China如下
interface China{ public static final String name="Jack"; public static int age=20; public void sayChina(); public void sayHello(String name, int age); }
然后让Person实现这个接口
class Person implements China{ ... @Override public void sayChina(){ System.out.println("hello ,China"); } @Override public void sayHello(String name, int age){ System.out.println(name+" "+age); } }
主函数咱们这样写
class hello{ public static void main(String[] args) { Class<?> demo=null; try{ demo=Class.forName("Reflect.Person"); }catch (Exception e) { e.printStackTrace(); } //保存所有的接口 Class<?> intes[]=demo.getInterfaces(); for (int i = 0; i < intes.length; i++) { System.out.println("实现的接口 "+intes[i].getName()); } } }
【运行结果】:
实现的接口 Reflect.China
接下来咱们还要讲如何获取父类、获取构造函数的修饰符、获取全部属性和方法,反射的应用(结合工厂模式,配合属性文件),相信大家会逐渐感受到反射的魅力。
【未完待续】
相关推荐
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...
java反射机制源码java反射机制源码java反射机制源码
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...
java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);
Java反射机制笔记 Java反射机制是Java语言中一个强大的功能,它允许程序在运行时检查和修改其自身的结构和行为。通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态...
Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...
### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...
Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...
### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...
### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...
Java反射机制是Java编程语言中一个强大的特性,它允许运行时的程序动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`...
Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...
自己总结的java反射机制的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至动态地创建对象并调用其方法。通过反射,开发者可以实现高度灵活和动态的代码,这对于框架开发、元编程...
1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息