通过反射访问构造方法

 Main_01.java

package ReflectOfConstructor;

import java.lang.reflect.*;
public class Main_01 {
public static void main(String[] args) {
//实例化Examle_01对象
System.out.println("101...");
//Example_01 example = new Example_01("10","20","30");
  Example_01 example =new Example_01();
//Object.getClass()是获取一个类型为Class的对象
System.out.println("102...");
Class<?extends Example_01> exampleC = example.getClass();
//获得所有的构造方法,按声明顺序返回
System.out.println("103...");
Constructor[] declaredConstructors = exampleC.getDeclaredConstructors();
System.out.println("104...");
for(int i = 0;i < declaredConstructors.length;i++){
//遍历构造方法
System.out.println("105...");
Constructor<?> constructor = declaredConstructors[i];
//isVarArgs()查看该构造方法是否允许带有可变数量的参数,如果允许则返回true,否则返回false
System.out.println("106...");
System.out.println("查看是否允许带有可变数量的参数:"+constructor.isVarArgs());
System.out.println("107...");
System.out.println("该构造方法的入口参数类型依次为:");
//getParameterTypes()按照声明顺序以Class数组的形式获得该构造方法的各个参数的类型
System.out.println("108...");
Class[] parameterTypes = constructor.getParameterTypes();
System.out.println("109...");
for(int j=0;j<parameterTypes.length;j++){
System.out.println("110...");
System.out.println(" "+parameterTypes[j]);
System.out.println("111...");
}
System.out.println("112...");
System.out.println("该构造方法可能抛出的异常类型为:");
//getExceptionTypes()以Class数组的形式获得该构造方法可能抛出的异常类型
System.out.println("113...");
Class[] exceptionTypes = constructor.getExceptionTypes();
System.out.println("114...");
for(int j=0;j<exceptionTypes.length;j++){
System.out.println("115...");
System.out.println(" "+exceptionTypes[j]);
System.out.println("116...");
}
System.out.println("117...");
Example_01 example2 = null;
System.out.println("118...");
while(example2==null){
System.out.println("119...");
try {//如果该成员变量的访问权为private,则抛出异常,既不允许访问
if(i==2)
{  System.out.println("120...");
  //newInstance()通过该构造方法利用指定参数创建一个该类的对象,如果未设置参数
  //则表示采取默认无参数构造方法。这里通过执行默认无参数的构造方法创建对象
  example2 = (Example_01) constructor.newInstance();
}
else if(i==1)
{  
System.out.println("121...");
//通过执行具有两个参数的构造方法创建对象
example2= (Example_01) constructor.newInstance("7",5);
}
else
{
System.out.println("122...");
//通过执行具有可变数量参数的构造方法创建对象
Object[] parameters = new Object[]{ new String[] {"100","200","300"}};
System.out.println("123...");
example2 = (Example_01) constructor.newInstance(parameters);
}
} catch (Exception e) {
System.out.println("124...");
// TODO Auto-generated catch block
System.out.println("在创建对象时抛出异常,下面执行setAccessible()方法");
constructor.setAccessible(true);//设置为允许访问
e.printStackTrace();

}
System.out.println("125...");
if(example2 !=null)
{
example2.print();
System.out.println();
}
}
}
}

Example_01.java

package ReflectOfConstructor;
/*
 * 通过反射访问构造方法的知识点
 */

public class Example_01 {
//在类Examle_01中声明一个String类型成员变量和3个int类型成员变量
String s;
int i1;
int i2;
int i3;
//无参构造方法
private Example_01(){
System.out.println("208...");
}
//具有两个参数的构造方法
protected Example_01(String s,int i){
System.out.println("207...");
this.s=s;
this.i1=i;
}
//具有可变数量参数的构造方法
public Example_01(String...strings) throws NumberFormatException{
System.out.println("201...");
if(0<strings.length){
System.out.println("202...");
i1=Integer.valueOf((strings[0]));
System.out.println(i1);
}
System.out.println("203...");
if(1<strings.length){
System.out.println("204...");
i2=Integer.valueOf((strings[1]));
System.out.println(i2);
}
System.out.println("205...");
if(2<strings.length){
System.out.println("206...");
i3=Integer.valueOf((strings[2]));
System.out.println(i3);
}
}
//普通方法
public void print(){
System.out.println("209...");
System.out.println("s="+s);
System.out.println("i1="+i1);
System.out.println("i2="+i2);
System.out.println("i3="+i3);
}
}

程序运行结果:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值