zoukankan      html  css  js  c++  java
  • 00111_通过反射获取构造方法并使用

    1、在反射机制中,把类中的成员(构造方法、成员方法、成员变量)都封装成了对应的类进行表示。其中,构造方法使用类Constructor表示。可通过Class类中提供的方法获取构造方法:

      (1)返回一个构造方法

    public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取public修饰, 指定参数类型所对应的构造方法
    public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取指定参数类型所对应的构造方法(包含私有的)

      (2)返回多个构造方法

    public Constructor<?>[] getConstructors() 获取所有的public 修饰的构造方法
    public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法(包含私有的)

      (3)获取构造方法的代码演示

     1 package cn.gzdlh_01_Reflect;
     2 
     3 import java.lang.reflect.Constructor;
     4 
     5 public class ReflectDemo {
     6     public static void main(String[] args) throws ClassNotFoundException,
     7             NoSuchMethodException, SecurityException {
     8         // 获取Class对象
     9         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");// 包名.类名
    10 
    11         // 获取所有的构造方法
    12         // Constructor[] cons = c.getConstructors();
    13         Constructor[] cons = c.getDeclaredConstructors();
    14         for (Constructor con : cons) {
    15             System.out.println(con);
    16         }
    17 
    18         System.out.println("------------------------");
    19         // 获取一个构造方法
    20         // public Person()
    21         Constructor con1 = c.getConstructor(null);
    22         System.out.println(con1);
    23 
    24         // public Person(String name)
    25         Constructor con2 = c.getConstructor(String.class);
    26         System.out.println(con2);
    27 
    28         // private Person(String name, int age)
    29         Constructor con3 = c.getDeclaredConstructor(String.class, int.class);
    30         System.out.println(con3);
    31 
    32         // public Person(String name, int age, String address)
    33         Constructor con4 = c.getDeclaredConstructor(String.class, int.class,
    34                 String.class);
    35         System.out.println(con4);
    36     }
    37 }

    2、通过反射方式,获取构造方法,创建对象

      (1)获取构造方法,步骤如下:
        ①获取到Class对象;

        ② 获取指定的构造方法;

        ③通过构造方法类Constructor中的方法,创建对象。

    public T newInstance(Object... initargs)

      (2)代码演示

     1 package cn.gzdlh_01_Reflect;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.InvocationTargetException;
     5 
     6 public class ConstructorDemo {
     7     public static void main(String[] args) throws ClassNotFoundException,
     8             NoSuchMethodException, SecurityException, InstantiationException,
     9             IllegalAccessException, IllegalArgumentException,
    10             InvocationTargetException {
    11         // 1,获取到Class对象
    12         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");// 包名.类名
    13         // 2,获取指定的构造方法
    14         // public Person()
    15         // Constructor con = c.getConstructor(null);
    16 
    17         // public Person(String name, int age, String address)
    18         Constructor con = c.getConstructor(String.class, int.class,
    19                 String.class);
    20 
    21         // 3,通过构造方法类中Constructor的方法,创建对象
    22         // Object obj = con.newInstance(null);
    23         Object obj = con.newInstance("gzdlh", 23, "广州");
    24 
    25         // 显示
    26         System.out.println(obj);
    27     }
    28 }

    3、通过反射方式,获取私有构造方法,创建对象

      (1)AccessibleObject 类是 Field、Method 和 Constructor 对象的父类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力;

      (2)对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查;

      (3)常用方法

    public void setAccessible(boolean flag) throws SecurityException 参数值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。参数值为 false 则指示反射的对象应该实施 Java 语言访问检查

      (4)获取私有构造方法,步骤如下:

        ①获取到Class对象;

        ②获取指定的构造方法;

        ③暴力访问, 通过setAccessible(boolean flag)方法;

        ④通过构造方法类Constructor中的方法,创建对象

    public T newInstance(Object... initargs)

      (5)代码演示

     1 package cn.gzdlh_01_Reflect;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.InvocationTargetException;
     5 
     6 public class ConstructorDemo2 {
     7     public static void main(String[] args) throws ClassNotFoundException,
     8             NoSuchMethodException, SecurityException, InstantiationException,
     9             IllegalAccessException, IllegalArgumentException,
    10             InvocationTargetException {
    11         // 1,获取到Class对象
    12         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");// 包名.类名
    13 
    14         // 2,获取指定的构造方法
    15         // private Person(String name, int age)
    16         Constructor con = c.getDeclaredConstructor(String.class, int.class);
    17 
    18         // 3,暴力反射
    19         con.setAccessible(true);// 取消 Java 语言访问检查
    20 
    21         // 4,通过构造方法类中的功能,创建对象
    22         Object obj = con.newInstance("gzdlh", 23);
    23         System.out.println(obj);
    24 
    25     }
    26 }
  • 相关阅读:
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.2.3 WWF的功能
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.1.3 WPF的架构
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.3.2 WCF的架构
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.3.1 WCF介绍
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.2.2 WWF的结构
    Visual C# 2008+SQL Server 2005 数据库与网络开发 14.2 Windows Workflow Foundation(WWF)
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.1.4 WPF和XAML
    Visual C# 2008+SQL Server 2005 数据库与网络开发 14.3 Windows Communication Foundation(WCF)
    Visual C# 2008+SQL Server 2005 数据库与网络开发14.2.1 WWF简介
    Visual C# 2008+SQL Server 2005 数据库与网络开发 14.4 小结
  • 原文地址:https://www.cnblogs.com/gzdlh/p/8159219.html
Copyright © 2011-2022 走看看