反射(个人理解)

1、Class

在程序运行期间,Java 运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。 虚拟机利用运行时类型信息选择相应的方法执行。,Class在内存中存储属于单例模式,同一个类型对应的
class对象是同一个,可以直接用==判断是否相等。

  获取Class对象的方式:

    方式1:如果 T 是任意的 Java 类型(或 void 关键字,)T.class 将代表匹配的类对象。 例如:Object类型、int类型、void类...都是可以的。

    方式2:Object 类中的 getClass( ) 方法将会返回一个 Class 类型的实例

    方式3:还可以调用静态方法 forName 获得类名对应的 Class 对象。 如:Class cl = Cl ass.forName(dassName) ; classname为完整类名。

    补充:

      Class常用方法:

        *getName():Class对象调用时返回的是类的完全限定名称。

        *newlnstance( ) :可以用来动态地创建一个类的实现,newlnstance 方法调用默认的构造器 没有参数的构造器初始化新创建的对象。 如果这个类没有默认的构造器就会抛出一个异常

            如:Object m = Cl ass.forName(s) .newlnstance(); 如果需要以这种方式向希望按名称创建的类的构造器提供参数就不要使用上面那条语句而必须使用 Constructor 类中的 newlnstance 方法         *Field[] getFields() :getFields 方法将返回一个包含 Field 对象的数组这些对象记录了这个类或其超类的公有域。         *Filed[] getDeclaredFie1ds() :getDeclaredField 方法也将返回包含 Field 对象的数组这些对象记录了这个类的全部域,无法获取超类的域字段。         补充:如果类中没有域或者 Class 对象描述的是基本类型或数组类型getFields()getDeclaredFie1ds()将返回一个长度为 0 的数组,这句话也可以这么理解,如果此Class对象描述的类为没有域,或者是

            基本类型的class对象,数组类型的class对象时(如int.class,Student[].class),getFields()与getDeclaredFie1ds()将返回一个长度为 0 的数组

        *Field[] getFields() :getFields 方法将返回一个包含 Field 对象的数组这些对象记录了这个类或其超类的公有域
        *Filed[] getDeclaredFie1ds() :getDeclaredField 方法也将返回包含 Field 对象的数组这些对象记录了这个类的全部域。 这些对象只记录这个类定义的域,不包括超类的域。

        *Field getField( String name ) :返回指定名称的公有域
        *Field getDeclaredField( String name ) :返回类中声明的给定名称的域

        *Constructor[] getConstructors():获的此类所有的共有的构造方法。

        *Constructor[] getDeclaredConstructors():获的此类的所有的构造方法。

        *getConstructor(Class<?>...parameterTypes):更据参数类型数组获取此类具体的公有构造方法。

        *getDeclaredConstructor(Class<?>...parameterTypes):更据参数类型获取此类具体的构造方法。
        *Method[] getMethods() :返回包含 Method 对象的数组getMethods 将返回所有的公有方法包括从超类继承来的公有方法
        *Method[] getDeclareMethods() :getDeclaredMethods 返回这个类或接口的全部方法但不包括由超类继承了的方法

        Method getMethod(String name, Class... parameterTypes) ://获取此类与超类中方法签名与此匹配的公共方法。

        Method getDeclaredMethod(String name, Class... parameterTypes)://获取此类中定义的与方法签名匹配的方法。

        *int getModifiers( ) :此方法返回一个修饰符的整形数,此数可以被java.lang.reflect.Modifie 的方法解析
        *isArray():此方法判断Class对象是否为数组对象,是的话就返回true,不是的话返回false;如System.out.println(int[].class.isArray());返回true。

        

        

    #Class 类实际上是一个泛型类例如, Employee.class 的类型是 Class<Employee>没有说明这个问题的原因是它将已经抽象的概念更加复杂化了在大多数实际问题中, 可以忽略类型参数而使用原始的 Class     #鉴于历史原 getName 方法在应用于数组类型的时候会返回一个很奇怪的名字: 如Double[ ] class.getName( ) 返回[Ljava.lang.Double;





   

2、Field类

  *int getModifiers( ) :返回一个用于描述 修饰符的整型数值使用 Modifier 类中的这个方法可以分析这个返回值。 
  *String getName( ) :返回域的名称
  *void setAccessible(boolean flag) :为反射对象设置可访问标志flag true 表明屏蔽 Java 语言的访问检查使得对象的私有属性也可以被査询和设置。 原因:java通过暴力反射获取私有的域对象,只
                        能够查看其名称却不能使用(java有一个安全机制),要想使用私有域,就要避免java的安全机制,就需要执行   *boolean isAccessible( ) :返回反射对象的可访问标志的值
      补充:java.Iang.reflect.AccessibleObject
              static void setAccessible(AccessibleObject[ ] array,boolean flag) //批量设置对象数组可访问标识
  
  *Object get( Object obj ) :返回 obj 对象中用 Field 对象表示的域值
  *void set(Object obj ,Object newValue) :用一个新值设置 Obj 对象中Field 对象表示的域

3、Method

*int getModifiers( ) :返回一个用于描述 修饰符的整型数值使用 Modifier 类中的这个方法可以分析这个返回值
*String getName( ) :返回方法的名称
*Class[ ] getParameterTypes ( ) ( 在 Constructor Method 类 中) :返回一个用于描述参数类型的 Class 对象数组
*Class getReturnType( ) ( 在 Method 类 中) :返回一个用于描述返H类型的 Class 对象
*void setAccessible(boolean flag) :为反射对象设置可访问标志flag true 表明屏蔽 Java 语言的访问检查使得对象的私有属性也可以被査询和设置。 原因:java通过暴力反射获取私有的域对象,只
                        能够查看其名称却不能使用(java有一个安全机制),要想使用私有域,就要避免java的安全机制,就需要执行
*boolean isAccessible( ) :返回反射对象的可访问标志的值
      补充:java.Iang.reflect.AccessibleObject
              static void setAccessible(AccessibleObject[ ] array,boolean flag) //批量设置对象数组可访问标识


*public Object invoke(Object implicitParameter,Object[] explicitParamenters) :调用这个对象所描述的方法传递给定参数并返回方法的返回值对于静态方法,把 mill 作为隐式参数传递
在使用包装器传递基本类型的值时, 基本类型的返回值必须是未包装的 理解:返回值为基本类型时要自己定义基本类型接收,不要用包装类型

 

 4、Constructor构造器类

newInstance(Object ... initargs):利用Constructor对象构造实例对象,Object ... initargs为构造器的参数

 

 

 

 

posted @ 2020-08-24 18:30  秦汉唐  阅读(107)  评论(0)    收藏  举报