java从入门到精髓 - 反射Constructor
import java.lang.reflect.Constructor;
//请注意执行顺序问题,开始时,我测试时用的是MyEclipse中的Jdk1.5.Jdk1.6我发现他们Constructor的顺序不一样的。
public class ReflectTest {
String s;
int i,i2,i3;
protected ReflectTest()
{
s="";
i=0;
i2=0;
i3=0;
}
protected ReflectTest(String s,int i)
{
this.s = s;
this.i = i;
}
public ReflectTest(String...strings) throws NumberFormatException //可变数量的参数
{
if(0<strings.length)
{
i = Integer.valueOf(strings[0]);
}
if(1<strings.length)
{
i2 = Integer.valueOf(strings[1]);
}
if(2<strings.length)
{
i3 = Integer.valueOf(strings[2]);
}
}
public void print()
{
System.out.println("s= "+s);
System.out.println("i="+i);
System.out.println("i2= "+i2);
System.out.println("i3="+i3);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Constructor []declaredConstructor = ReflectTest.class.getDeclaredConstructors();//获得所有的构造方法
for(int i=0;i<declaredConstructor.length;i++)
{
Constructor constructor = declaredConstructor[i];
System.out.println("查看是否允许带有可变数量的参数:"+constructor.isVarArgs());//是否允许带有可变数量的参数
System.out.println("该构造方法的入口参数类型依次为:");
Class [] parameterTypes = constructor.getParameterTypes();
for(int j=0;j<parameterTypes.length;j++)//构造方法的入口参数类型
{
System.out.println("parameterTypes["+j+"]"+ parameterTypes[j]);
}
System.out.println("该构造方法可能抛出的异常类型:");
Class []exceptionTypes = constructor.getExceptionTypes();
for(int j=0;j<exceptionTypes.length;j++)//构造方法可能抛出的异常类型
{
System.out.println("exceptionTypes["+j+"]"+ exceptionTypes[j]);
}
ReflectTest reflectTest = null;
while(reflectTest ==null) //调用类中的构造方法
{
try
{
if(i==0) //请注意执行顺序,可以先把这些语句注释掉,看下顺序再执行下面的代码.
{
reflectTest=(ReflectTest)constructor.newInstance();
}
else if(i==2)
{
reflectTest=(ReflectTest)constructor.newInstance("7",5);
}
else if(i==1)
{
Object[] parameters = new Object[]{new String[]{"100","200","300"}};
//Object []parameters = new String[]{"100","200","300"};
reflectTest =(ReflectTest)constructor.newInstance(parameters);
}
}catch(Exception e)
{
System.out.println("在创建对象时抛出异常:下面执行setAccessible");
e.printStackTrace();
constructor.setAccessible(true);
}
}
reflectTest.print();
System.out.println();
System.out.println("*********************");
}
}
/**
* @return the s
*/
protected String getS() {
return s;
}
/**
* @param s the s to set
*/
protected void setS(String s) {
this.s = s;
}
/**
* @return the i
*/
protected int getI() {
return i;
}
/**
* @param i the i to set
*/
protected void setI(int i) {
this.i = i;
}
/**
* @return the i2
*/
protected int getI2() {
return i2;
}
/**
* @param i2 the i2 to set
*/
protected void setI2(int i2) {
this.i2 = i2;
}
/**
* @return the i3
*/
protected int getI3() {
return i3;
}
/**
* @param i3 the i3 to set
*/
protected void setI3(int i3) {
this.i3 = i3;
}
}
//请注意执行顺序问题,开始时,我测试时用的是MyEclipse中的Jdk1.5.Jdk1.6我发现他们Constructor的顺序不一样的。
public class ReflectTest {
String s;
int i,i2,i3;
protected ReflectTest()
{
s="";
i=0;
i2=0;
i3=0;
}
protected ReflectTest(String s,int i)
{
this.s = s;
this.i = i;
}
public ReflectTest(String...strings) throws NumberFormatException //可变数量的参数
{
if(0<strings.length)
{
i = Integer.valueOf(strings[0]);
}
if(1<strings.length)
{
i2 = Integer.valueOf(strings[1]);
}
if(2<strings.length)
{
i3 = Integer.valueOf(strings[2]);
}
}
public void print()
{
System.out.println("s= "+s);
System.out.println("i="+i);
System.out.println("i2= "+i2);
System.out.println("i3="+i3);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Constructor []declaredConstructor = ReflectTest.class.getDeclaredConstructors();//获得所有的构造方法
for(int i=0;i<declaredConstructor.length;i++)
{
Constructor constructor = declaredConstructor[i];
System.out.println("查看是否允许带有可变数量的参数:"+constructor.isVarArgs());//是否允许带有可变数量的参数
System.out.println("该构造方法的入口参数类型依次为:");
Class [] parameterTypes = constructor.getParameterTypes();
for(int j=0;j<parameterTypes.length;j++)//构造方法的入口参数类型
{
System.out.println("parameterTypes["+j+"]"+ parameterTypes[j]);
}
System.out.println("该构造方法可能抛出的异常类型:");
Class []exceptionTypes = constructor.getExceptionTypes();
for(int j=0;j<exceptionTypes.length;j++)//构造方法可能抛出的异常类型
{
System.out.println("exceptionTypes["+j+"]"+ exceptionTypes[j]);
}
ReflectTest reflectTest = null;
while(reflectTest ==null) //调用类中的构造方法
{
try
{
if(i==0) //请注意执行顺序,可以先把这些语句注释掉,看下顺序再执行下面的代码.
{
reflectTest=(ReflectTest)constructor.newInstance();
}
else if(i==2)
{
reflectTest=(ReflectTest)constructor.newInstance("7",5);
}
else if(i==1)
{
Object[] parameters = new Object[]{new String[]{"100","200","300"}};
//Object []parameters = new String[]{"100","200","300"};
reflectTest =(ReflectTest)constructor.newInstance(parameters);
}
}catch(Exception e)
{
System.out.println("在创建对象时抛出异常:下面执行setAccessible");
e.printStackTrace();
constructor.setAccessible(true);
}
}
reflectTest.print();
System.out.println();
System.out.println("*********************");
}
}
/**
* @return the s
*/
protected String getS() {
return s;
}
/**
* @param s the s to set
*/
protected void setS(String s) {
this.s = s;
}
/**
* @return the i
*/
protected int getI() {
return i;
}
/**
* @param i the i to set
*/
protected void setI(int i) {
this.i = i;
}
/**
* @return the i2
*/
protected int getI2() {
return i2;
}
/**
* @param i2 the i2 to set
*/
protected void setI2(int i2) {
this.i2 = i2;
}
/**
* @return the i3
*/
protected int getI3() {
return i3;
}
/**
* @param i3 the i3 to set
*/
protected void setI3(int i3) {
this.i3 = i3;
}
}