-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来代替,这是否也与反射相关呢?