本帖最后由 张yy 于 2013-7-20 15:37 编辑
通过反射 访问构造方法
代码如下:- class Example_01 {
- String s;
- int i,i2,i3;
- private Example_01(){
-
- }
-
- protected Example_01(String s,int i){
- this.s = s;
- this.i = i;
- }
-
- public Example_01(String...strings)throws NumberFormatException{
-
- if(strings.length>0)
- i = Integer.valueOf(strings[0]);
- if(strings.length>1)
- i2 = Integer.valueOf(strings[1]);
- if(strings.length>2)
- 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);
- }
- }
复制代码
- import java.lang.reflect.*;
- public class Reflect_Constructor {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Example_01 example = new Example_01();
- Class exampleC = example.getClass();
-
- //获取所有构造方法
- Constructor[] declaredConstructors = exampleC.getDeclaredConstructors();
-
- for(int i=0;i<declaredConstructors.length;i++){
- //遍历构造方法
- Constructor constructor = declaredConstructors[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]);
- }
-
- System.out.println("该构造方法可能抛出的异常类型为:");
- //获取所有可能抛出的异常信息类型
- Class[] exceptionTypes = constructor.getExceptionTypes();
- for(int j=0;j<exceptionTypes.length;j++){
- System.out.println(""+exceptionTypes[j]);
- }
-
-
- Example_01 example2 = null;
- while(example2 == null){
- //如果该成员变量的访问权限为private,则抛出异常,即无法访问
- try{
- //通过执行默认没有参数的构造方法创建对象
- if(i == 2)
- example2 = (Example_01) constructor.newInstance();
-
- //通过执行具有两个参数的构造方法创建对象
- else if(i == 1)
- example2 = (Example_01) constructor.newInstance("7",5);
-
- //通过执行具有可变数量参数的构造方法创建对象
- else{
- Object[] parameters = new Object[]{
- new String[]{"100","200","300"}
- };
- example2 = (Example_01) constructor.newInstance(parameters);
- }
- }
- catch(Exception e){
- System.out.println("在创建对象时出现异常,下面执行setAccessible()方法");
- //设置为允许访问
- constructor.setAccessible(true);
- }
- }
-
- example2.print();
- System.out.println();
-
- }
- }
- }
复制代码 在没加while抛出异常这段的时候运行正常,
结果为:
查看是否允许带有可变数量的参数:false
该构造方法的入口参数类型依次为:
该构造方法可能抛出的异常类型为:
查看是否允许带有可变数量的参数:false
该构造方法的入口参数类型依次为:
class java.lang.String
int
该构造方法可能抛出的异常类型为:
查看是否允许带有可变数量的参数:true
该构造方法的入口参数类型依次为:
class [Ljava.lang.String;
该构造方法可能抛出的异常类型为:
class java.lang.NumberFormatException
加上while抛出异常并输出相应值得这段以后,
无限运行出现结果:在创建对象时出现异常,下面执行setAccessible()方法
搞晕了,求解释
|