美文网首页
Java 反射机制

Java 反射机制

作者: ssddd1200 | 来源:发表于2016-10-05 22:48 被阅读0次

    反射(Reflection)是java语言的一个特性,它允程序在运行时来进行自我检查并且对内部的成员进行操作。一个常见的例子是在JavaBean中,一些组件可以通过一个构造器来操作。这个构造器就是用的反射在动态加载的时候来获取的java中类的属性的。

    反射相关的包

    java.lang.reflect
    java.lang.Class(反射的开始)

    通过反射了解类

    给定一个类或者对象,通过反射机制可以动态的
    了解类的属性,方法,构造函数
    创建对象
    调用方法
    改写属性

    应用场景

    运行时,动态的情况下应对外面传入的类名,对象实例等
    只知道类名字符串
    通常应用到框架中

    反射的开始:类类型 Class Class

    java中有一个类很特殊,就是Class类,这个类是有JVM来创建的,所以我们就不用麻烦了。如果我们拿到一个类的类型信息,就可以利用反射获取其各种成员以及方法了。
    在没有对象实例的时候,主要有三种办法。

    System.out.println("Method 1:"); //通过一个实例来获得
    class Class dog=new Dog().getClass(); 
    System.out.println(dog.getName()); 
    
    System.out.println("Method 2:"); //通过className来获得 
    Class c=Class.forName(className); 
    
    System.out.println("Method 3:"); //通过已知的类获取class 
    Class b=Dog.class; 
    

    注意:第二种方式中,forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。
    现在得到Class就可以创建一个对象的实例了,利用Class的newInstance方法相当于调用类的默认的构造器。

    //方法一 :调用类的空构造方法
    Object o=dogClazz.newInstance(); 
    System.out.println("创建的对象是:");
    System.out.println(o); 
    //方法二 :使用有参数的构造方法:Constructor类,这个类用来封装反射得到的构造器
    Constructor c=dogClazz.getConstructor(new Class[]{String.class,int.class});
    Object o2=c.newInstance("大黄",5);
    
    获取类的成员变量

    成员变量用Field类进行封装,主要的方法非常的类似:
    public [Field] getDeclaredField([String]) 获取任意指定名字的成员
    public [Field][] getDeclaredFields() 获取所有的成员变量
    public [Field] getField([String] name) 获取任意public成员变量
    public [Field][] getFields() 获取所有的public成员变量

    注意,以上的四个方法全部需要抛出异常,当我们获得私有的方法的时候,要用setAccessible设置一下可访问的权限。

    Object o = dogClazz.newInstance();
    System.out.println("通过空的构造函数创建的对象是"+ o);
    Field[] fields=dogClazz.getFields();
    for(Field f:fields){
          System.out.println(f.getName());          
    }
    Field f = dogClazz.getField("name");
    f.set(o, "hisdog");
    f.get(o);
    

    获取类的方法

    封装类的方法的类是Method.获取method也有四个方法
    public [Method][] getMethods() 获取所有的共有方法的集合
    **public [Method] getMethod([String] name,[Class]<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合 **
    public [Method][] getDeclaredMethods() 获取所有的方法
    public [Method] getDeclaredMethod([String] name,[Class]<?>... parameterTypes) 获取任意指定方法

    Object o = dogClazz.newInstance();
    System.out.println("通过空的构造函数创建的对象是"+ o);
    Method m=dogClazz.getMethod("bark", new Class[]{});
    m.invoke(o, new Object[]{});
    

    注意:在获取类和成员变量时若含有Declared的方法,是获得自定义的目标

    相关文章

      网友评论

          本文标题:Java 反射机制

          本文链接:https://www.haomeiwen.com/subject/gbxeyttx.html