反射操作构造方法

反射操作构造方法:

通过以上我们知道可以使用反射机制操作类的结构,包括调用类的构造方法、操作类的普通方法、访问类的属性、取得类或者方法上注解信息等。

反射操作构造方法:

要使用反射操作构造方法,得先使用堆区的那个Class类对象取得构造方法的信息,构造方法的信息取得之后需要封装到一个对象中返回(到处都是面向对象的思想),这个保存了构造方法信息的对象是什么类型呢?在Java提供了一个类型专门描述构造方法,这个类型是“java.lang.reflect.Constructor”,就可以使用该类表示构造方法。但是如何取得这个表示构造方法的对象呢?使用堆区的Class类对象的方法:

public Constructor getConstructor(Class<?>… parameterTypes)

【根据构造方法的参数类型的Class类对象取得构造方法,该参数是一个可变参数,参数表示构造方法的参数类型的对应的Class类对象】

public Constructor<?>[] getConstructors() throws SecurityException

【返回所有的构造方法,这些构造方法保存到一个数组中返回】

package com.sxt.vo;
import java.io.Serializable;
import java.util.Date;
package com.sxt;
public class Test {
    public static void main(String[] args) throws Exception {
         //取得Emp堆区中的Class类对象
         Class<?>  empClass=Class.forName("com.sun.vo.Emp");
         //实例化Emp类对象
         Emp   emp=(Emp)empClass.newInstance();
        System.out.println(emp);
    }
}

public class Emp implements Serializable {
    private  Integer  empno;
    private  String ename;
    private  String  job;
    private  Double  sal;
    private  Double  comm;
    private  Integer mgr;
    private  Integer   deptno;
    private Date  hierdate;
    public Emp(Integer empno, String ename, String job, Double sal, Double comm, Integer mgr, Integer deptno, Date hierdate) {
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.sal = sal;
        this.comm = comm;
        this.mgr = mgr;
        this.deptno = deptno;
        this.hierdate = hierdate;
    }
    public Emp(Integer empno, String ename, String job, Double sal, Double comm, Integer mgr, Integer deptno) {
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.sal = sal;
        this.comm = comm;
        this.mgr = mgr;
        this.deptno = deptno;
    }
    public Emp(Integer empno, String ename, String job, Double sal, Double comm, Integer mgr) {
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.sal = sal;
        this.comm = comm;
        this.mgr = mgr;
    }
    public Emp(Integer empno, String ename, String job, Double sal, Double comm) {
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.sal = sal;
        this.comm = comm;
    }
    public Emp(Integer empno, String ename, String job, Double sal) {
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.sal = sal;
    }
    public Emp(Integer empno, String ename, String job) {
        this.empno = empno;
        this.ename = ename;
        this.job = job;
    }
    public Emp(Integer empno, String ename) {
        this.empno = empno;
        this.ename = ename;
    }
    public Emp(Integer empno) {
        this.empno = empno;
    }
    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                ", comm=" + comm +
                ", mgr=" + mgr +
                ", deptno=" + deptno +
                ", hierdate=" + hierdate +
                '}';
    }
}

在这里插入图片描述
此时发现了没有找到无参数构造方法,所以我们知道使用newInstance()方法实例化对象的时候默认调用是无参数构造方法,因为我们为Emp提供了有参构造,就不会默认提供无参构造了,需要显示的定义出无参构造

提供无参构造:

public Emp() {
}

在这里插入图片描述
此时默认调用了无参数构造方法,那么如何去调用有参数构造呢? 如果要调用有参构造那么需要使用反射取得有参数构造方法。

取得所有的构造方法:

要取得构造方法,那么我们要知道表示构造方法的类是“java.lang.reflect.Constructor”,里面的方法:

public String getName():取得构造方法的名称
public int getParameterCount():返回构造方法参数的个数

package com.sxt;
import java.lang.reflect.Constructor;
public class Test {
    public static void main(String[] args) throws Exception {
         //取得Emp堆区中的Class类对象
         Class<?>  empClass=Class.forName("com.sun.vo.Emp");
         //取得所有的构造方法
         Constructor<?>  [] cons=empClass.getConstructors();
         for(int  i=0;i<cons.length;i++){
             System.out.println(cons[i].getParameterCount());
         }
    }
}

在这里插入图片描述
以上取得是所有构造方法,如何取得指定的某个构造方法呢?

取得指定的某个构造方法:

 package com.sxt;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
public class Test {
    public static void main(String[] args) throws Exception {
         //取得Emp堆区中的Class类对象
         Class<?>  empClass=Class.forName("com.sun.vo.Emp");
         //取得指定的构造方法
         Constructor  con1=empClass.getConstructor(Integer.class);
         //使用该构造方法实例化对象
         Emp emp1 =(Emp)con1.newInstance(1001);
         System.out.println(emp1);
         Constructor  con2=empClass.getConstructor(Integer.class,String.class);
         Emp  emp2=(Emp)con2.newInstance(1002,"张三");
         System.out.println(emp2);
         Constructor  con3=empClass.getConstructor(Integer.class,String.class,String.class);
         Emp emp3=(Emp)con3.newInstance(1002,"李四","总裁");
         System.out.println(emp3);
    }
}

在这里插入图片描述

总结:

1、可以使用Class类对象的getConstructor()系列的方法取得构造方法对象

2、在反射中使用Constructor类表示构造方法。

3、getConstructor()只能取得类的public修饰的构造方法
构造方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值