`

java反射机制学习(二):通过反射获取构造方法并实例化对象

    博客分类:
  • Java
阅读更多

通过反射实例化SUser对象

public static void main(String[] args) {
	Class<?> c = null;
	try{
		c = Class.forName("com.wjl.reflect.SUser");//实例化class
		SUser user = null;
		user = (SUser)c.newInstance();//实例化SUser类
//			(要求SUser类必须有无参构造方法,否则报错:java.lang.InstantiationException
		//因为newInstance()方法调用的是SUser类的无参构造方法进行的实例化	)
		user.setUserName("admin");
		user.setPassWord("123456");
		System.out.println(user);//默认调用toString方法
	}catch(Exception e){
		e.printStackTrace();
	}
}

以上方法有一个问题:SUser对象必须有无参构造方法,若是没有则会报错 ,解决方法有俩:一个是为SUser明确指定无参构造方法,二是通过Class实例化SUser对象时指定构造方法。

指定构造方法测试代码如下:

public static void main(String[] args){
	Class<?> c = null;
	try{
		c = Class.forName("com.wjl.reflect.SUser");//实例化class
		//获取class所在类的所有构造方法
		Constructor<?> con[] = null;
		con = c.getConstructors();//获取SUser类中的所有构造方法
		for(int i=0;i<con.length;i++){
			System.out.println(con[i]);
			//SUser类中定义了三个构造方法,输出结果依次为:
			/*
			public com.wjl.reflect.SUser(java.lang.String)
			public com.wjl.reflect.SUser(java.lang.String,java.lang.String)
			public com.wjl.reflect.SUser()
			*/
		}
		SUser user = null;
		SUser user2 = null;
		SUser user3 = null;
		user = (SUser)con[0].newInstance("admin");//带一个参数
		user2 = (SUser)con[1].newInstance("admin","123456");//带两个参数
		user3 = (SUser)con[2].newInstance();//没有参数
		//以上三个构造方法分别实例化SUser时不能弄错,即con的下标与各个构造方法的顺序得一致,否则报错:
//			java.lang.IllegalArgumentException: wrong number of arguments
		
		System.out.println(user);
		System.out.println(user2);
		System.out.println(user3);
		/*结果:
		用户名:admin,密码:null
		用户名:admin,密码:123456
		用户名:null,密码:null
		*/
	}catch(Exception e){
		e.printStackTrace();
	}
}

通过getConstructors方法获取SUser的所有构造方法,再根据参数情况和返回的构造方法数组的顺序依次进行实例化。如代码中所说,这里有一个注意的地方, 即:con的下标与各个构造方法的顺序得一致。

con数组的第一个构造方法为:public com.wjl.reflect.SUser(java.lang.String),即带一个参数的构造方法,那么newInstance时就必须使用con[0]的构造方法且带有一个参数,若是使用con[1](带2个参数)就必须带两个参数,否则就会报错。

 

自己拼接构造方法格式

public static void main(String[] args) {
	try{
		Class c = Class.forName("com.wjl.reflect.Person");
		Constructor<?> con[] = c.getConstructors();
		for(int i=0;i<con.length;i++){
			System.out.println("系统:"+con[i]);
			System.out.print("自定义:");
			getConstructorInfo(con[i]);
		}
	}catch(Exception e){
		e.printStackTrace();
	}
}

//自己拼接构造方法
public static void getConstructorInfo(Constructor con){
	System.out.print(Modifier.toString(con.getModifiers())+" ");//修饰符
	System.out.print(con.getName());//类名称
	System.out.print("(");
	//获取参数类型
	Class<?> p[] = con.getParameterTypes();
	for(int j=0;j<p.length;j++){
		System.out.print(p[j].getName());
		if(j<p.length-1){
			System.out.print(",");
		}
	}
	System.out.print(")"+"\n");
}
 
分享到:
评论

相关推荐

    Java反射机制学习(二)

    通过`Class`对象的`newInstance()`方法可以实例化无参构造器的类;如果有参数的构造器,我们需要使用`getDeclaredConstructor()`或`getConstructor()`来获取指定的构造器,然后调用`newInstance()`传递参数。 4. **...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,...通过学习和实践Java反射机制,你可以更深入地理解Java的运行机制,并在需要动态性、灵活性的场景中发挥其强大的功能。不过,使用反射时也应注意潜在的风险和性能影响。

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    Java反射机制学习总结

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    5. **枚举的构造函数**:枚举类默认是final且私有的,所以不能通过常规方式实例化新的枚举值。但反射可以访问私有构造函数,尽管不推荐这样做,因为这违反了枚举的设计原则。 在"test-enum-demo-master"项目中,...

    java反射机制学习笔记+反射机制实操案例

    总结来说,Java反射机制是Java语言的一个重要特性,它使得程序能够在运行时动态地获取类的信息并进行操作,提高了代码的通用性和适应性。在实际开发中,反射机制常用于框架设计、插件系统、数据持久化等领域,但同时...

    Java反射机制的详细讲解及实例,有助于java深度开发

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...

    JAVA 反射机制应用

    - 对象实例化:通过Class对象的newInstance()方法或Constructor对象的newInstance()方法创建对象。 - 访问类成员:获取Field、Method和Constructor对象,进而访问类的字段、调用方法或构造函数。 2. **Field类** ...

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    Java反射机制的学习

    Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...

    java 反射机制详解

    在上述的示例中,`Util` 类的 `convertStr2ServiceBean` 方法展示了如何通过反射来创建对象并调用其方法。首先,`Class.forName()` 用于根据字符串 `beanName` 加载对应的类,这里可能是 `Son1` 或 `Son2`。然后,`...

    java反射机制原理和反射机制总结

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...

    Java反射机制经典案例

    首先,获取`Person`的`Class`对象,然后通过`getDeclaredMethod()`获取`setName`方法,接着使用`invoke()`设置姓名,最后通过`newInstance()`创建对象并调用`getName()`获取姓名。 通过以上介绍,我们了解了Java...

    java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型)并调用方法,创建对象,甚至...

    java反射机制实例

    其次,反射机制允许我们在运行时创建并实例化对象。使用`newInstance()`方法,我们可以创建指定类的实例,但需要注意的是,该类必须有一个无参构造器,因为`newInstance()`会尝试调用这个构造器: ```java Object ...

    java反射机制,很安逸.不要错过

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...

    java反射机制讲解

    Java反射机制让我们能够在运行时获取类的信息,包括类名、属性、方法、构造器等,并能动态地调用方法和修改属性值。这种特性对于那些需要在运行时根据条件执行不同操作或者处理未知类型的场景非常有用。例如,框架如...

    JAVA反射机制学习

    在Java反射中,`Class`对象的`newInstance()`方法可以用于实例化对象,但前提是没有无参构造器。如果类有参数化的构造器,我们需要使用`Constructor`类来获取构造器,并通过`newInstance()`方法传入参数。 字段访问...

Global site tag (gtag.js) - Google Analytics