java反射获取构造器以及调用构造器创建对象

来源:互联网 发布:篮球鞋 知乎 编辑:程序博客网 时间:2024/05/17 07:47

Java反射获取构造器

 

获取某一个类中所有构造器

1. 明确操作的是哪一个类(严格的说是类编译后的字节码)

2. 获取构造器

Constructor类:表示类中构造器的类型,Constructor实例表示的就是某一个类中的某一个构造器

Class类中的:

public Constructor<?>[]  getConstructors();//该方法只能获取当前Class所表示的类的public构造器——?表示通配符,即可以匹配所有类型, 其指当前构造器所在的类(字节码)

Eg:   

class User

{

private User(){   }

public User(String name){.....}

public User(String  name,  int  age){...}

}

 

Class<User> clz=User.class;//也可写为 Class<?> clz=User.class;或者Class clz=User.class;

Constructor[]  cs=clz.getConstructors();//也可写为Constructor<?>[]  cs=clz.getConstructors();——?表示通配符,即可以匹配所有类型, 其指当前构造器所在的类(字节码)

public Constructor<?>[]  getDeclaredConstructors();//该方法获取当前Class所表示的类的所有构造器(包括publicprotectedprivate修饰的,即与访问权限无关)——返回的顺序任意

 

获取某一个类中指定的一个构造器

1. 明确操作的是哪一个类(严格的说是类编译后的字节码)

2. 获取构造器

Class clz=User.class;

应该告诉程序想要获取的是具有什么形参列表的构造器

Class类中的:  public Constructor<T>  getConstructor(Class<?>... parameterTyoes);//parameterTyoes表示构造器参数的Class类型——注意使用的是可变参数方式——该方法只能获取当前Class所表示的类中指定的一个public修饰的构造器

Constructor cs1=clz.getConstructor(String.class);

Constructor cs2=clz.getConstructor(String.classint.class);

 

public Constructor<T>  getDeclardConstructor(Class<?>... parameterTyoes);//该方法获取当前Class所表示的类中指定的一个构造器(publicprotectedprivate,即与访问权限无关)

 

 

 

调用构造器,创建对象

1. 先找到被调用构造器所在的类的字节码

2. 找到被调用的指定的构造器

3. 执行该构造器

Eg:   

class User

{

public User(){   }

public User(String name){.....}

private User(String  name,  int  age){...}

}

需求:调用User()构造器

Class<User>  clz=User.class;//Class clz=User.class;Class<>  clz=User.class;

Constructor<User>  c=clz.getConstructor();

Constructor类中有一个方法:public T newInstance(Object... initargs);——返回:T当前构造器所在的类类型;参数:initargs,,表示构造器的实际参数

User user=c.newInstance();

//Constructor  c=clz.getConstructor();没有指明具体泛型,则类型丢失,只能使用Object user=c.newInstance();——要调用对应类所具有的属性和方法,需要进行强制类型转换,否则编译时,在Object中检查该方法或属性,没有找到,会报编译错误。

如果一个类中的构造器可以直接访问,同时没有参数,那么可以直接使用Class类中的public Object newInstance()创建对象

User user=clz.newInstance();

 

需求:调用带参数的构造器

Class<User>  clz=User.class;//Class clz=User.class;Class<>  clz=User.class;

Constructor<User>  c=clz.getConstructor(String.class);

User user=c.newInstance(“limi”);

 

需求:调用私有的构造器

Class<User>  clz=User.class;//Class clz=User.class;Class<>  clz=User.class;

Constructor<User>  c=clz.getDeclardConstructor(String.classint.class);

User user=c.newInstance(“limi”, 17);//会出现IllegalAccessException异常,不能直接访问private修饰的成员

为了安全性考虑,private成员外界不准访问

但是,一定要访问:此时就要告诉程序在运行期间忽略掉该安全检查

AccessibleObject——可访问类

ConstructorFieldMethod类都继承于该类

AccessibleObject类中有一个方法:public void setAccessible(boolean  flag);——设置是否可访问,即使是私有的,true表示可访问

又因为ConstructorFieldMethod类都继承于该类,故Constructor类具有该方法

解决上述问题:

Class<User>  clz=User.class;//Class clz=User.class;Class<>  clz=User.class;

Constructor<User>  c=clz.getDeclardConstructor(String.classint.class);

c.setAccessible(true);

User user=c.newInstance(“limi”, 17);

 

 

 

 

 

 

0 0