黑马程序员——提升篇——反射基本概念

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------

1、JAVA反射机制:“ 程序 运行时,允许改变程序结构或 变量 类型,这种语言称为 动态语言 ”。 JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class。 反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,  那么就可以通过反射机制来获得类的所有信息。 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。
2、 获取Class对象有三种方式:
       1).通过Object类的getClass()方法。对象.getClass(),例如:
                                         Class cls1 = new String("").getClass();
       2).通过Class类的静态方法——forName()来实现:forName中的参数一定是完整的类名(包名+类名),class.forName("类名"),
                                         Class cls2 = Class.forName("java.lang.String");
       3)  .如一个已加载的的类型的话,在java中,它的.class文件名:类名.class就代表了与其匹配的Class对象,例如:
                                         String str = new String("abcd");
                                         Class c5 = str.class;
3、 反射机制的优点与缺点       动态与静态的概念, 

             静态编译:在编译时确定类型,绑定对象,即通过。

             动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有效降低类之间的藕合性。 反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。

      缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。


4、

1)获得构造函数的方法 

           public Constructor<?>[] getConstructors()      返回类中所有的public构造器集合,默认构造器的下标为0
           public Constructor<T> getConstructor(Class<?>... parameterTypes)   返回指定public构造器,参数为构造器参数类型集合
           public Constructor<?>[] getDeclaredConstructors()  返回类中所有的构造器,包括私有
           public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回任意指定的构造器

2)获得类方法的方法              

           public Method[] getMethods()    获取所有的共有方法的集合

           public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合  
           public Method[] getDeclaredMethods()  获取所有的方法
           public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法
3)获得类中属性的方法 
           public Field getDeclaredField(String name)  获取任意指定名字的成员
           public Field[] getDeclaredFields()             获取所有的成员变量
           public Field getField(String name)           获取任意public成员变量

           public Field[] getFields()                          获取所有的public成员变量

package Reflect;
//通过一个对象获得完整的包名和类名
class Demo
{
           //方法
}
class ClassName
{
    public static void main(String[] args) 
   {
        Demo demo = new Demo();
        System.out.println(demo.getClass().getName());
    }
}

这一章节很多概念还没有理解透彻,所以还在学习。


----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值