Logo

郎哥编程

构造方法的相关操作

2020-01-03 186

Constructor类提供了对构造方法的操作方法,利用这些方法可以获取构造方法的参数、修饰符,并可以通过获取的构造方法实例化类。

获取构造方法的参数

应用Constructor类可以获取构造方法的参数个数、参数名称和参数类型。方法说明如下。

●   String  getName()

该方法用于获取构造方法的名称。

●   int  getParameterCount()

该方法用于获取构造方法参数的个数。

●   Class<?>[]   getParameterTypes()

该方法返回类对象数组,该数组按构造方法参数的声明顺序,包含了构造方法的参数类型。

案例1:建立ConstructorTest3测试类,获取Person类所有构造方法的名称、参数个数和参数名称。

在constructor包下新建ConstructorTest3测试类。代码如下:

package constructor;
 
import java.lang.reflect.Constructor;
 
/** 
* @ClassName: ConstructorTest3 
* @Description: 反射(使用获取的构造方法实例化类)案例2
* @author 编程训练营 
* @date 
* 
*/
 
public class ConstructorTest3 {
 
    /** 
    * @Title: main 
    * @Description: Java程序入口main方法
    * @param @param args    参数 
   
    * @return void    返回类型 
    * @throws 
    */
 
    public static void main(String[] args) {
       // 获取Person类的Class对象
       Class<?>  personClass = (Class)Person.class;
       //通过class.getDeclaredConstructors获取所有构造方法
       Constructor[] constructors1 = personClass.getDeclaredConstructors();
       for (Constructor constructor : constructors1) {
           System.out.println("-------构造方法-------");
            System.out.println("构造方法名称:" + constructor.getName());
            System.out.println("构造方法参数个数:" + constructor.getParameterCount());
            // 如果是有参构造方法,输出构造方法的参数
            if( constructor.getParameterCount() > 0 )
            {
                //通过constructor.getParameterTypes()获取参数类数组(Class)
                Class[] paramClasses = constructor.getParameterTypes();
                int nParamCount = 1;
                for (Class paramClass : paramClasses) {
                    System.out.printf("参数%d:%s\n",nParamCount,paramClass.getName());
                    nParamCount++;
                }
            }
       }
    }
 
}

ConstructorTest3程序首先应用Class类的getDeclaredConstructors()方法获取Person类的所有构造方法,然后输出每个构造方法的名称和参数个数,如果是有参构造方法,再应用Constructor类的getParameterTypes()方法获取该构造方法的所有参数,输出每个参数的名称。getParameterTypes()方法返回的是Class对象数组,数组的每个元素是参数的Class对象。

获取构造方法的修饰符

Constructor类的getModifiers()方法返回一个整数,该整数可用于Modifier类定义方法的传入参数。

Constructor类的getModifiers()方法说明如下。

●   int  getModifiers()

该方法返回一个整数,该整数可用于Modifier获取修饰符方法的传入参数。

Modifier类定义了多个静态方法用于获取当前对象修饰符信息,Modifier类的主要方法说明如下。

●   boolean  isPublic(int mod)

该方法用于判断当前对象是否使用public访问权限修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。

●   boolean  isProtected (int mod)

该方法用于判断当前对象是否使用protected访问权限修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。

●   boolean  isPrivate (int mod)

该方法用于判断当前对象是否使用private访问权限修饰符,如果是返回true,否则返回false。mod值对象的getModifiers()方法返回。

●   boolean  isStatic (int mod)

该方法用于判断当前对象是否使用static修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。

●   boolean  isFinal (int mod)

该方法用于判断当前对象是否使用static修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。

●   boolean  isAbstract (int mod)

该方法用于判断当前对象是否使用abstract修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。

●   boolean  isInterface (int mod)

该方法用于判断当前对象是否使用interface修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。

●   String  toString (int mod)

该方法以字符串的方式返回当前对象的所有修饰符。mod值由对象的getModifiers()方法返回。

案例2:建立ConstructorTest4测试类,获取Person类所有构造方法的修饰符。

在constructor包下新建ConstructorTest4测试类。代码如下:

package constructor;
 
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
 
/**
 * @ClassName: ConstructorTest4
 * @Description: 反射(构造方法的相关操作)案例2
 * @author 编程训练营
 * @date
 *
 */
 
public class ConstructorTest4 {
 
    /**
     * @Title: main
     * @Description: Java程序入口main方法
     * @param @param args 参数
     *
     * @return void 返回类型 @throws
     */
 
    public static void main(String[] args) {
 
       // 获取Person类的Class对象
       Class<?> personClass = (Class) Person.class;
       // 通过class.getDeclaredConstructors获取所有构造方法
       Constructor[] constructors1 = personClass.getDeclaredConstructors();
       for (Constructor constructor : constructors1) {
           System.out.println("-------构造方法-------");
           // 获取可以解析构造方法修饰符需要的整数
           int mod = constructor.getModifiers();
           System.out.println("构造方法的修饰符:" + Modifier.toString(mod));
          
       }
    }
 
}

ConstructorTest4程序应用Constructor类getModifiers()方法,获取可以解析构造方法修饰符需要的整数,然后调用Modifier类的toString()方法以字符串方式输出构造方法的修饰符。

用构造方法实例化类

应用Constructor类可以应用构造方法来实例化类。实例化类方法说明如下:

●   T  newInstance(Object... initargs)

该方法用指定的参数创建该类的一个实例化对象,如果参数错误,会抛出IllegalArgumentException异常。

案例3:建立ConstructorTest5测试类,获取Person类的构造方法并实例化Person对象。

在constructor包下新建ConstructorTest5测试类。代码如下:

package constructor;
 
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
 
/** 
* @ClassName: ConstructorTest5 
* @Description: 反射(构造方法的相关操作)案例3
* @author 编程训练营 
* @date 
* 
*/
 
public class ConstructorTest5 {
 
    /** 
    * @Title: main 
    * @Description:Java程序入口main方法
    * @param @param args    参数 
   
    * @return void    返回类型 
    * @throws 
    */
 
    public static void main(String[] args) {
       // 获取Person类的Class对象
       Class<?> personClass = (Class) Person.class;
       // 获取指定参数类型具有public权限的构造方法
       try {
           Constructor paramConstructor = personClass.getConstructor(String.class, int.class);
           //通过constructor.newInstance(args...)以指定构造方法进行对象实例化
            Person person = (Person) paramConstructor.newInstance("张三", 36);
            if( null != person )
            {
               System.out.println("person对象的哈希码:" + person.hashCode());
               System.out.println("person对象的成员变量name:" + person.getName());
               System.out.println("person对象的成员变量age:" + person.getAge());
            }
       } catch (NoSuchMethodException | SecurityException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (InstantiationException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IllegalAccessException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IllegalArgumentException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (InvocationTargetException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
    }
 
}

ConstructorTest5程序应用Class类的getConstructor()方法获取指定参数的构造方法,然后调用Constructor类的newInstance()方法实例化Person对象。newInstance()方法会抛出IllegalArgumentException等异常,因此在程序中需要处理这些异常。

程序执行结果如下图所示:

image.png

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论