大家都知道:当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的。
但是有一种方法可以把带有私有构造器的类实例化出对象。
在java的反射机制中,可以通过Class.forName(类名).newInstance()来实例化一个对象,还可以获取类的所有方法和构造方法。
Constructor这个类,表示类构造器,即构造方法。在生成类对象的时候,会调用构造方法。
java代码:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package
cn.org.constructor
;
import java.lang.reflect.Constructor ; class User { private String name ; public int age ; public User ( ) { } private User ( int age ) { super ( ) ; this. age = age ; } public User ( String name, int age ) { super ( ) ; this. name = name ; this. age = age ; } public void print ( ) { System. out. println ( "name=" +name ) ; System. out. println ( "age=" +age ) ; } } public class Cons { public static void main ( String [ ] args ) throws Exception, SecurityException { User u = new User ( ) ; //获得User的字节码 Class clz = u. getClass ( ) ; //获取所有公共构造器 Constructor [ ] cpublic = clz. getConstructors ( ) ; for ( Constructor constructor : cpublic ) { System. out. println (constructor ) ; } //获取所有的构造函数 Constructor [ ] cAll = clz. getDeclaredConstructors ( ) ; for ( Constructor constructor : cAll ) { System. out. println (constructor ) ; } //因为是私有的构造函数,要给其访问的权限 //获取指定的私有构造函数 Constructor <User > cprivate = clz. getDeclaredConstructor ( int. class ) ; cprivate. setAccessible ( true ) ; //设定权限为true,使其可以访问。如果没有这个权限的话,会出异常 User u1 = cprivate. newInstance ( 23 ) ; System. out. println (u1 ) ; //获取指定的构造器 Constructor <User > c = clz. getConstructor ( String. class, int. class ) ; User u2 = c. newInstance ( "zhangsan ", 22 ) ; System. out. println (u2 ) ; //简单的创建实例的方法,但是只能用于创建没有参数的公共的。 clz. newInstance ( ) ; } } |
输出:
1
2 3 4 5 6 7 |
public
cn.
org.
constructor.
User
(java.
lang.
String,
int
)
public cn. org. constructor. User ( ) public cn. org. constructor. User (java. lang. String, int ) private cn. org. constructor. User ( int ) public cn. org. constructor. User ( ) cn. org. constructor. User@15db9742 cn. org. constructor. User@6d06d69c |