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 }

原文地址:https://www.cnblogs.com/gzdlh/p/8159219.html

时间: 2024-11-05 18:42:13

00111_通过反射获取构造方法并使用的相关文章

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

类 Constructor<T>:提供关于类的单个构造方法的信息以及对它的访问权限. 通过反射的方法获取构造方法并使用  ps:先忽略泛型 A.1:获取构造方法的数组: public Constructor<?>[] getConstructors():获得所有公共构造方法 public Constructor<?>[] getDeclaredConstructors():获得所有构造方法 A.2:获取单个构造方法(用于非私有的构造方法) public Construc

反射获取构造方法

/** Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Class类的getConstructor (String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance ("张三",20)方法创建对象 @throws Exception*/ public static void main(String[] args) throws E

Android(java)学习笔记107:通过反射获得构造方法并且使用

下面我会通过代码形式进行讲解: 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 // 获取字节码文件对

Android(java)学习笔记108:通过反射获取私有构造方法并且使用

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 st

通过反射获取class文件中的构造方法,运行构造方法

/* * 通过反射获取class文件中的构造方法,运行构造方法 * 运行构造方法,创建对象 * 1.获取class文件对象 * 2.从class文件对象中,获取需要的成员 * * Constructor 描述构造方法对象类 */ 1.person类,用于测试获取无参的构造方法 package cn.itcast.demo1; public class Person { public String name; private int age; /*static{ System.out.printl

java通过反射获取私有的构造方法,及反射擦除泛型数据类型约束

/* * 反射获取私有的构造方法运行 * 不推荐,破坏了程序的安全性,封装性 * 暴力私有 */ public class ReflectDemo4 { public static void main(String[] args)throws Exception { Class c=Class.forName("demo01.Person"); Constructor con=c.getDeclaredConstructor(int.class,String.class); //Con

[转]java 通过反射获取类的全局变量、方法、构造方法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.str; public class ZiFuChuan {          public static String ss = "全局变量!!!!!!";     String s2 = null;     public int aa = 1 ;     int aa2;     double dou = 1.1;     Double d = new Dou

java通过反射获取调用变量以及方法

一:反射概念 可以通过Class类获取某个类的成员变量以及方法,并且调用之. 二:通过反射获取方法.变量.构造方法 1 @Test 2 // 通过反射获取类定义的方法 3 public void testMethod() throws Exception { 4 @SuppressWarnings("rawtypes") 5 Class clazz = Class.forName("java.lang.String"); 6 Method[] m = clazz.g

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

1.在反射机制中,把类中的成员方法使用类Method表示: 2.通过Class类中提供的方法获取成员方法: (1)返回获取一个方法 public Method getMethod(String name, Class<?>... parameterTypes) 获取public 修饰的方法 public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取任意的方法,包含私有的 参数1: name