java反射实例化对象

时间:2021-09-27 09:21:41

-Class类

Java中手动创建的每一个类,在编译后JVM都会为其创建一个Class类对象,在这个Class类对象中保存了所建类的信息。

可通过Class类提供的方法为一个类实例化对象,区别与new关键字创建对象,前者是在类已经编译好的情况下,通过指定类名来创建实例化对象,后者是在编译之后之间创建实例化对象。

也可通过Class类在运行时获得某个类对象的信息。

下面是获取Class类对象的三种方法。

package org.test;
/** 
 * @ClassName: TestDemo
 * @Description: 获取Class类对象的三种方法
 * @author 王逍遥
 * @date 2018-6-8 下午1:13:56 
 */
class Person{}
public class TestDemo {
	public static void main(String args[]) throws ClassNotFoundException{
		Person per = new Person();
		/*
		 * getClass()取得Person的Class类对象,Object类提供此方法
		 * 看源码可知getClass()返回的是Class<?>,per.getClass()取得的就是Person类的Class类对象
		 * */
		System.out.println(per.getClass().getName());   //输出Class类对象中Person类的信息
		
		Class<?> cls = Person.class;	//Person.class,取得Person类的Class类对象
		System.out.println(cls.getName());	  //输出Class类对象中Person类的信息
		
		Object obj = Class.forName("org.test.Person");
		System.out.println(obj.getClass().getName());
		
		Class<?> cls2 = Class.forName("org.test.Person");	//forName通过全限定名获取Class类对象
		System.out.println(cls2.getName());	  //输出Class类对象中Person类的信息
	}
}

通过反射实例化对象:

package org.test;
/** 
 * @ClassName: TestDemo02 
 * @Description: 反射实例化对象
 * @author 王逍遥
 * @date 2018-6-8 下午1:13:56 
 */
class Person {
	public Person() {
		System.out.println("**************");    //由这个输出可知,反射实例化对象也要调用构造方法
	}
}
public class TestDemo {
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ 
		Class<?> cls = Class.forName("org.test.Person");	//通过类全限定名获取Person的Class类对象
		Person per = (Person) cls.newInstance(); // newInstance()实例化对象
		System.out.println(per);
	}
}

newInstance()在运行时实例化对象,关于运行时这一点,可以参考工厂模式与反射的结合,即只需要更改主方法中的类全限定名参数,就可以增加实例化对象。

-总结

Java可以通过反射机制来实例化一个对象,也可用反射调用构造方法,指定构造方法参数,另外还有反射调用方法、属性等。反射加强了Java的配置性和扩展性(比如反射与工厂模式的集合),Spring框架提供的许多功能都是Java反射来实现,SpringIoC就是。

另外疑问ssm框架中许多可写在Java代码中的内容都用*.xml来代替,这是否也与反射相关呢?