且谈谈我对Java反射的理解

 在张老师的课程当中,谈到了反射的概念,用冯伟立学长的最简单的一句话来说就是:反射就是把Java类中的各种成分映射成相应的Java类。

当然在很多教科书上有其他的一些定义,大多数比较长的解释。比如说:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量 和方法;在运行时调用任意一个对象的方法;生成动态代理。
利用反射机制能获得什么信息
         一句话,类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字,要不就没有后文了
    首先得根据传入的类的全名来创建Class对象。
    Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;
    Object obj=c.newInstance();//创建对象的实例
    OK,有了对象就什么都好办了,想要什么信息就有什么信息了。  
    获得构造函数的方法
    Constructor getConstructor(Class[] params)//根据指定参数获得public构造器

    Constructor[] getConstructors()//获得public的所有构造器

    Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器

    Constructor[] getDeclaredConstructors()//获得public的所有构造器
   
    获得类方法的方法
    Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法

    Method[] getMethods()//获得所有的public方法

    Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法

    Method[] getDeclaredMethods()//获得所以的public和非public方法
   
    获得类中属性的方法
    Field getField(String name)//根据变量名得到相应的public变量

    Field[] getFields()//获得类中所以public的方法

    Field getDeclaredField(String name)//根据方法名获得public和非public变量

    Field[] getDeclaredFields()//获得类中所有的public和非public方法


Java的反射非常强大,传递class, 可以动态的生成该类、取得这个类的所有信息,包括里面的属性、方法以及构造函数等,甚至可以取得其父类或父接口里面的内容。

  obj.getClass().getDeclaredMethods();//取得obj类中自己定义的方法, 包括私有的方法。
  obj.getClass().getMethods();//取得obj类中自己定义的方法及继承过来的方法, 但私有方法得不到。
  同样, 对field也是一样,obj.getClass().getDeclaredFields();取得的是这个类中所有的属性,包括私有的field; 对obj.getClass().getFields();//取得是自己以及接继承来的属性, 但不能取得自己的私有属性。

Java代码   收藏代码
  1. static Object create(Class clazz) throws Exception {  
  2.     Constructor con = clazz.getConstructor(String.class);  
  3.     Object obj = con.newInstance("test name");  
  4.     return obj;  
  5.   }  
  6.   
  7.   static void invoke1(Object obj, String methodName)  
  8.       throws IllegalArgumentException, IllegalAccessException,  
  9.       InvocationTargetException, Exception, NoSuchMethodException {  
  10.     Method[] ms = obj.getClass().getDeclaredMethods();  
  11.     ms = obj.getClass().getMethods();  
  12.     for (Method m : ms) {  
  13.       // System.out.println(m.getName());  
  14.       if (methodName.equals(m.getName()))  
  15.         m.invoke(obj, null);  
  16.     }  
  17.   
  18.     Method m = obj.getClass().getMethod(methodName, null);  
  19.     m.invoke(obj, null);  
  20.   }  
  21.   
  22.   static void field(Class clazz) throws Exception {  
  23.     Field[] fs = clazz.getDeclaredFields();  
  24.     //fs = clazz.getFields();  
  25.     for (Field f : fs)  
  26.       System.out.println(f.getName());  
  27.   }  
  28.     
  29.   static void annon(Class clazz) throws Exception {  
  30.     Annotation[] as = clazz.getAnnotations();  
  31.   }  

反射在Java中对初学者来说算是比较难理解的一块了。
对于一个程序员来说,面向对象编程往往是一个分水岭,有很多程序员理解不了面向对象的机制,往往就放弃了继续前进。
我是做php编程出身,php支持面向过程,也支持面向对象编程,面向对象编程往往也是php程序员的分水岭。
Javaweb中,自定义标签是一个程序员的分水岭。而Java的反射,我认为也是一个程序员实力衡量的一个很重要的标准,虽然反射在一定程度上增加运行程序的成本,但是可以简化很多工作。


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我对Java理解是,它是一种面向对象的编程语言,它使用类和对象来组织代码,有助于创建大型、可扩展的应用程序。Java可以让开发人员高效地开发出可移植性强、运行速度快的程序,同时也拥有一个强大的库,可以满足不同类型应用程序的需求。 ### 回答2: Java是一种面向对象的高级编程语言,我对它的理解是它的跨平台性和广泛应用。 首先,Java的跨平台性是它最为出众的特点之一。它的编译器将源代码编译成称为字节码的平台中立的中间代码,然后由Java虚拟机(JVM)解释执行。这种设计使得Java程序可以在任何支持Java虚拟机的操作系统上运行,不需要针对不同平台进行重新编写或重新编译。这为开发者提供了极大的便利性,使得Java成为互联网和企业级应用开发的首选语言之一。 其次,Java的广泛应用也是我对它的理解Java已经成为了许多领域的事实标准,特别是在企业领域。无论是开发网站和Web应用,还是构建大规模的分布式系统和数据库,Java都能胜任,并且有许多优秀的框架和工具可供选择。此外,Java还被广泛应用于Android移动应用开发,使得它成为全球最流行的移动应用开发语言之一。 总的来说,我认为Java是一门极具灵活性和可扩展性的编程语言,具有良好的跨平台性和广泛的应用领域。它不仅适用于不同规模的项目开发,而且还有一个庞大的开发者社区,提供了许多有价值的资源和支持。因此,我认为对于想要进入软件开发行业或者在企业级应用开发领域发展的人来说,了解和掌握Java是非常有必要的。 ### 回答3: 对于我来说,Java是一种高级的、通用的面向对象的程序设计语言。它可以运行在各种平台上,因此具有很强的跨平台性。Java的语法简洁清晰,易于学习和理解,而且具有更高的可读性,使得开发者能够更加方便地编写和维护代码。 Java是一个极其强大的语言,拥有丰富的类库和工具,可以满足各种应用程序的开发需求。Java的标准库提供了大量的类和方法,涵盖了从基本的数据结构到网络编程、图形用户界面等各个方面。同时,Java还有许多第三方库和框架,可以帮助开发者更加高效地进行开发工作。 Java还具有良好的跨平台性,这意味着开发者可以编写一次代码,就可以在不同的操作系统和硬件平台上运行。这是因为Java源代码被编译成一种称为字节码的中间格式,然后在Java虚拟机(JVM)上运行。JVM充当了一个虚拟计算机的角色,它可以将字节码翻译成特定平台的机器码,从而实现跨平台的能力。 另外,Java还具有良好的安全性和稳定性。Java的设计目标之一是提供一种可以在开放网络环境下运行的安全语言,因此在Java中,有许多内置的安全机制来确保程序的运行安全。同时,Java也具有垃圾回收机制,可以自动管理内存,减少了内存管理的负担,提高了程序的稳定性和可靠性。 总之,我认为Java是一种非常优秀的编程语言,它不仅可以满足各种需求,而且具有良好的可读性、跨平台性、安全性和稳定性。对我来说,学习和使用Java是非常有意义的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值