zoukankan      html  css  js  c++  java
  • JAVA 反射用法

    1.获得Class对象

    1. Class<?>  classType  =  Class.forName() 可以通过传入一个全限定类名(包含包名)返回一个该类的Class类对象引用 。
    2. Class<?>  classType  =  object.getClass()   通过引用的到Class对象。
    3. Class<?>  classType  =  Object.class  通过类字面常量获得,好处就是懒加载,只有使用时才会加载。

    2.获得构造器

    1. 获得指定构造器 

      • Constructor<TgetConstructor(Class<?>... parameterTypes)

      • parameterTypes 是 Class[ ] ,它里面的元素和元素顺序与构造器参数对应。

      1. Constructor  constructor  = getConstructor(new Class[ ] { } ),获得默认构造器。
      2. Constructor  constructor  = getConstructor(new Class[ ] {String.class, int.class}),获得参数为(String,int) 的构造器。
    2. 获得所有构造器

      • Constructor[ ]  constructor = classType.getConstructors()

    3.获得字段

    1. 获得public字段

      1. Field field =  classTypre.getField( String name ) ;  获得对应名称的字段,注意只能获得所有public字段,包括父类的public字段,其他权限的字段无法获得。
      2. Field[ ] fields =  classTypre.getField() ;  获得所有public字段的数组。
    2. 获得自身字段

      1. Field field = classTypre.getDeclaredField( String name); 获得 当前类定义的字段,包括所有权限。不包括父类任何字段,哪怕是public。
      2. Field[ ] fields =  classTypre.getDeclaredField() ;  获得所有字段的数组。
    3. 获得所有字段包括父类的字段

      1. getSuperClass()获得父类Class对象,getSuperClass()
      2. 循环调用 getSuperClass()和getDeclaredFields[ ],把Field放入List即可。

    4.获得方法

    1. 获得public方法

      1. Method method=  classTypre.getMethod ( String name ,Class<?>... parameterTypes) ;  根据方法签名的方法。
        • name是方法名,parameterTypes是 Class [ ],用来获取方法参数的类型
        • 注意只能获得所有public方法,包括父类的public字段,其他权限的字段无法获得。
      2. Method [ ] methods=  classTypre.geMethods() ;  获得所有public方法。
    2. 获得自身方法

      1. Method method= classTypre.getDeclaredMethod (String name ,Class<?>... parameterTypes);
        •  获得 当前类定义的方法,包括所有权限。不包括父类任何方法,哪怕是public。
      2. Method [ ] methods=  classTypre.getDeclaredMethods() ;  获得所有字段的数组。
    3. 获得所有字段包括父类的方法

      1. getSuperClass()获得父类Class对象,getSuperClass()
      2. 循环调用 getSuperClass()和getDeclaredMethods(),把Method放入List即可。

    5.获取修改字段相关信息

    • 反射只是通过Class对象获得方法和字段,要获取实例的字段就要传入一个具体的实例。
    1. 获取字段值

      1. Object value = field.get( Object obj)  通过get方法获得实例对象obj对应的field的值。
      2. 如果field是静态字段则可以直接使用get(null)获取值。
      3. 获取基本类型字段的值 : int value = field.get(Object obj) 获取int类型的字段。还有其他类型也是用同样的方法。
      4. private修饰的字段无法直接获得,必须先设置file.setAccessible(true) 才能访问
    2. 获取字段相关信息并通过Modifier解析修饰符

      1. Annotation<?> annotation  = field.getAnnotation(Class<T> annotationClass) 返回字段上的指定注解
      2. Annotation[ ] annotations = field.getDeclaredAnnotations() 返回字段上的所有注解数组
      3. Class<?> type = field.getType()  返回 字段 的类型 的 Class对象。
      4. int  modifier = field.getModifiers()  以int形式返回字段的修饰符。
        • 通过Modifier静态方法判断是不是某一个权限修饰符,如Modifier.isPrivate(modifier)
        • 再如:Modifier.isStatic(modifier) 判断是不是静态成员
        • Modifier静态方法toString 返回权限标识符。
    3. 设置修改字段值

      1. field.set( Object obj, Object value)  通过set方法设置实例对象obj对应的file字段的值为value。
      2. 设置基本类型字段的值 :field.set(Object obj,int value) 获取int类型的字段。还有其他类型也是用同样的方法。
      3. private修饰的字段无法直接设置,必须先设置field.setAccessible(true) 才能设置。
      4. 被final修饰的字段,可以通过反射临时修改值,但是不会把原始值修改了,所以final是绝对不可变的。

    6.获取方法相关信息

    • 和字段一样需要传入一个实例对象。
    1. 获取字段相关信息并通过Modifier解析修饰符

      1. Annotation<?> annotation  = method.getAnnotation(Class<T> annotationClass) 返回方法上的指定注解
      2. Annotation[ ] annotations = method.getDeclaredAnnotations() 返回方法上的所有注解数组
      3. Class<?> type = field.getReturnType()  返回 方法返回值类型 的 Class对象。
    2.          int  modifier = method.getModifiers()  以int形式返回字段的修饰符。
        • 通过Modifier静态方法判断是不是某一个权限修饰符,如Modifier.isPrivate(modifier)
        • 再如:Modifier.isStatic(modifier) 判断是不是静态成员
        • Modifier静态方法toString 返回权限标识符。
    3. 通过反射调用方法

      1. method.invoke(Object obj, Object... args)  传入实例对象obj和方法对应的参数。
      2. private修饰的方法无法反射,必须先设置method.setAccessible(true) 才能反射调用。

    7.创建实例对象其他办法

    1. 通过反射得来的构造器创建实例。
      1. 默认构造器创建对象。
         Constructor<?> constructor = studentClass1.getConstructor(new Class[]{});
         Student student1 = (Student)constructor.newInstance();

         也可以写成constructor.newInstance(new Object[ ]  {  })

      2. 带参构造器创建对象。
         Constructor<?> constructor2 = studentClass1.getConstructor(new Class[]{int.class});
         Student student2 = (Student)constructor2.newInstance(12);

         也可以写成constructor.newInstance(new Object[ ]  { 12 })

    2. 通过Class对象创建实例
      Student student3 = Student.class.newInstance();
    3. 还有通过 new 、 反序列化、colon( ) 方法创建对象,Java中所以一共有5种方法创建实例对象。
  • 相关阅读:
    POJ 1953 World Cup Noise
    POJ 1995 Raising Modulo Numbers (快速幂取余)
    poj 1256 Anagram
    POJ 1218 THE DRUNK JAILER
    POJ 1316 Self Numbers
    POJ 1663 Number Steps
    POJ 1664 放苹果
    如何查看DIV被设置什么CSS样式
    独行DIV自适应宽度布局CSS实例与扩大应用范围
    python 从入门到精通教程一:[1]Hello,world!
  • 原文地址:https://www.cnblogs.com/mibloom/p/9675351.html
Copyright © 2011-2022 走看看