• 反射(三)之通过反射获取构造方法, 成员变量, 成员方法


    一.通过反射获取构造方法并使用

      获取构造方法
        getConstructors
        getDeclaredConstructors
      创建对象
        newInstance()
        con.newInstance(“zhangsan", 20);

    二.通过反射获取成员变量并使用

      获取所有成员
        getFields,getDeclaredFields
      获取单个成员
        getField,getDeclaredField
      修改成员的值
        set(Object obj,Object value)
         将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

    三.通过反射获取成员方法并使用

      获取所有方法
        getMethods
        getDeclaredMethods
      获取单个方法
        getMethod
        getDeclaredMethod
      暴力访问(否则会报Illegalxxx...Exception...)
        method.setAccessible(true);

    注意:

      getDeclaredConstructors, getDeclaredFields, getDeclaredMethods, 这里加Declared是可以获取非public声明的构造方法, 成员变量, 成员方法.(否则会报NoSuch.....Exception...)

    四.示例

    4.1 首先自定义Person类

     1 package cn.itcast_01;
     2 
     3 public class Person {
     4     private String name;
     5     int age;
     6     public String address;
     7 
     8     public Person() {
     9     }
    10 
    11     private Person(String name) {
    12         this.name = name;
    13     }
    14 
    15     Person(String name, int age) {
    16         this.name = name;
    17         this.age = age;
    18     }
    19 
    20     public Person(String name, int age, String address) {
    21         this.name = name;
    22         this.age = age;
    23         this.address = address;
    24     }
    25 
    26     public void show() {
    27         System.out.println("show");
    28     }
    29 
    30     public void method(String s) {
    31         System.out.println("method " + s);
    32     }
    33 
    34     public String getString(String s, int i) {
    35         return s + "---" + i;
    36     }
    37 
    38     private void function() {
    39         System.out.println("function");
    40     }
    41 
    42     @Override
    43     public String toString() {
    44         return "Person [name=" + name + ", age=" + age + ", address=" + address
    45                 + "]";
    46     }
    47 
    48 }
    View Code

    4.2 通过反射获取构造方法并使用

    4.2.1 通过反射获取构造方法并使用

     1 package cn.itcast_02;
     2 
     3 import java.lang.reflect.Constructor;
     4 
     5 import cn.itcast_01.Person;
     6 
     7 /*
     8  * 通过反射获取构造方法并使用。
     9  */
    10 public class ReflectDemo {
    11     public static void main(String[] args) throws Exception {
    12         // 获取字节码文件对象
    13         Class c = Class.forName("cn.itcast_01.Person");
    14 
    15         // 获取构造方法
    16         // public Constructor[] getConstructors():所有公共构造方法
    17         // public Constructor[] getDeclaredConstructors():所有构造方法
    18         // Constructor[] cons = c.getDeclaredConstructors();
    19         // for (Constructor con : cons) {
    20         // System.out.println(con);
    21         // }
    22 
    23         // 获取单个构造方法
    24         // public Constructor<T> getConstructor(Class<?>... parameterTypes)
    25         // 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
    26         Constructor con = c.getConstructor();// 返回的是构造方法对象
    27 
    28         // Person p = new Person();
    29         // System.out.println(p);
    30         // public T newInstance(Object... initargs)
    31         // 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
    32         Object obj = con.newInstance();
    33         System.out.println(obj);
    34         
    35         // Person p = (Person)obj;
    36         // p.show();
    37     }
    38 }
    View Code

    4.2.2 通过反射去获取该构造方法并使用

     1 package cn.itcast_02;
     2 
     3 import java.lang.reflect.Constructor;
     4 
     5 /*
     6  * 需求:通过反射去获取该构造方法并使用:
     7  * public Person(String name, int age, String address)
     8  * 
     9  * Person p = new Person("林青霞",27,"北京");
    10  * System.out.println(p);
    11  */
    12 public class ReflectDemo2 {
    13     public static void main(String[] args) throws Exception {
    14         // 获取字节码文件对象
    15         Class c = Class.forName("cn.itcast_01.Person");
    16 
    17         // 获取带参构造方法对象
    18         // public Constructor<T> getConstructor(Class<?>... parameterTypes)
    19         Constructor con = c.getConstructor(String.class, int.class,
    20                 String.class);
    21 
    22         // 通过带参构造方法对象创建对象
    23         // public T newInstance(Object... initargs)
    24         Object obj = con.newInstance("林青霞", 27, "北京");
    25         
    26         System.out.println(obj);
    27     }
    28 }
    View Code

    4.2.3 通过反射获取私有构造方法并使用

     1 package cn.itcast_02;
     2 
     3 import java.lang.reflect.Constructor;
     4 
     5 /*
     6  * 需求:通过反射获取私有构造方法并使用
     7  * private Person(String name){}
     8  * 
     9  * Person p = new Person("风清扬");
    10  * System.out.println(p);
    11  */
    12 public class ReflectDemo3 {
    13     public static void main(String[] args) throws Exception {
    14         // 获取字节码文件对象
    15         Class c = Class.forName("cn.itcast_01.Person");
    16 
    17         // 获取私有构造方法对象
    18         // NoSuchMethodException:每个这个方法异常
    19         // 原因是一开始我们使用的方法只能获取公共的,下面这种方式就可以了。
    20         Constructor con = c.getDeclaredConstructor(String.class);
    21 
    22         // 用该私有构造方法创建对象
    23         // IllegalAccessException:非法的访问异常。
    24         // 暴力访问
    25         con.setAccessible(true);// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。
    26         Object obj = con.newInstance("风清扬");
    27 
    28         System.out.println(obj);
    29     }
    30 }
    View Code

    4.3 通过反射获取成员变量并使用

     1 package cn.itcast_03;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Field;
     5 
     6 /*
     7  * 通过发生获取成员变量并使用
     8  */
     9 public class ReflectDemo {
    10     public static void main(String[] args) throws Exception {
    11         // 获取字节码文件对象
    12         Class c = Class.forName("cn.itcast_01.Person");
    13 
    14         // 获取所有的成员变量
    15         // Field[] fields = c.getFields();
    16         // Field[] fields = c.getDeclaredFields();
    17         // for (Field field : fields) {
    18         // System.out.println(field);
    19         // }
    20 
    21         /*
    22          * Person p = new Person(); p.address = "北京"; System.out.println(p);
    23          */
    24 
    25         // 通过无参构造方法创建对象
    26         Constructor con = c.getConstructor();
    27         Object obj = con.newInstance();
    28         System.out.println(obj);
    29 
    30         // 获取单个的成员变量
    31         // 获取address并对其赋值
    32         Field addressField = c.getField("address");
    33         // public void set(Object obj,Object value)
    34         // 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
    35         addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京"
    36         System.out.println(obj);
    37 
    38         // 获取name并对其赋值
    39         // NoSuchFieldException
    40         Field nameField = c.getDeclaredField("name");
    41         // IllegalAccessException
    42         nameField.setAccessible(true);
    43         nameField.set(obj, "林青霞");
    44         System.out.println(obj);
    45 
    46         // 获取age并对其赋值
    47         Field ageField = c.getDeclaredField("age");
    48         ageField.setAccessible(true);
    49         ageField.set(obj, 27);
    50         System.out.println(obj);
    51     }
    52 }
    View Code

    4.4 通过反射获取成员方法并使用

     1 package cn.itcast_04;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Method;
     5 
     6 public class ReflectDemo {
     7     public static void main(String[] args) throws Exception {
     8         // 获取字节码文件对象
     9         Class c = Class.forName("cn.itcast_01.Person");
    10 
    11         // 获取所有的方法
    12         // Method[] methods = c.getMethods(); // 获取自己的包括父亲的公共方法
    13         // Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法
    14         // for (Method method : methods) {
    15         // System.out.println(method);
    16         // }
    17 
    18         Constructor con = c.getConstructor();
    19         Object obj = con.newInstance();
    20 
    21         /*
    22          * Person p = new Person(); p.show();
    23          */
    24 
    25         // 获取单个方法并使用
    26         // public void show()
    27         // public Method getMethod(String name,Class<?>... parameterTypes)
    28         // 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
    29         Method m1 = c.getMethod("show");
    30         // obj.m1(); // 错误
    31         // public Object invoke(Object obj,Object... args)
    32         // 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数
    33         m1.invoke(obj); // 调用obj对象的m1方法
    34 
    35         System.out.println("----------");
    36         // public void method(String s)
    37         Method m2 = c.getMethod("method", String.class);
    38         m2.invoke(obj, "hello");
    39         System.out.println("----------");
    40 
    41         // public String getString(String s, int i)
    42         Method m3 = c.getMethod("getString", String.class, int.class);
    43         Object objString = m3.invoke(obj, "hello", 100);
    44         System.out.println(objString);
    45         // String s = (String)m3.invoke(obj, "hello",100);
    46         // System.out.println(s);
    47         System.out.println("----------");
    48 
    49         // private void function()
    50         Method m4 = c.getDeclaredMethod("function");
    51         m4.setAccessible(true);
    52         m4.invoke(obj);
    53     }
    54 }
    View Code
  • 相关阅读:
    SQL中UNION的使用
    [转]身份证号准确性检测
    shell中if/seq/for/while/until
    shell中数字、字符串、文件比较测试
    shell简介及变量的定义查看撤销
    grep/字符/次数匹配/锚定符/小大括号/wc/tr/cut/sort/uniq
    linux全局和个人配置文件说明
    linux文件的3个时间和7种文件类型
    linux常用配置文件和命令总结
    目录方式扩展swap分区大小
  • 原文地址:https://www.cnblogs.com/yadongliang/p/8311345.html
Copyright © 2020-2023  润新知