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

Posted Lamfai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于00111_通过反射获取构造方法并使用的主要内容,如果未能解决你的问题,请参考以下文章

反射机制获取并动态操作_方法_属性_构造器

java 27 - 3 反射之 通过反射获取构造方法并使用

第十四章 类型信息1(java的反射)

[Java基础]反射获取构造方法并使用

javaSE第二十七天

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