* 反射的动态性 * 在代码运行过程中,并不知道需要造哪个对象(根据业务来决定需要造的对象) * 因此需要反射在运行时造对象 体现了反射的动态性 编译过程并不知道需要造哪个对象,只有在运行时,根据客户的需求造对象
package Reflection;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 反射的动态性
* 在代码运行过程中,并不知道需要造哪个对象(根据业务来决定需要造的对象)
* 因此需要反射在运行时造对象 体现了反射的动态性 编译过程并不知道需要造哪个对象,只有在运行时,根据客户的需求造对象
*
*/
public class ReflectionTest {
@Test
public void test() throws Exception {
Class personClass = Person.class;
//1、通过反射,创建Person类的对象
Constructor cons = personClass.getConstructor(String.class, int.class);
Object tom = cons.newInstance("Tom", 12); //实例化对象 Person tom1 = new Person("Tom", 12);
Person p = (Person) tom;
System.out.println(p.toString());
}
// 获取Class的实例
@Test
public void test3() throws Exception {
//方式一:调用运行时类的属性:.class
Class<Person> clazz1 = Person.class;
System.out.println(clazz1);
//方式二:通过运行时类的对象,调用getClass()
Person person = new Person();
Class clazz2 = person.getClass();
System.out.println(clazz2);
//方式三:调用Class的静态方法: forName(String classPath) 全类名 常用:编译时不去确定,运行时确定,类体现反射的动态性
Class clazz3 = Class.forName("Reflection.Person");
System.out.println(clazz3);
System.out.println(clazz1 == clazz2); //true
System.out.println(clazz1 == clazz3); //true
//方式四:使用类的加载器:ClassLoader
ClassLoader classLoader = ReflectionTest.class.getClassLoader();
Class<?> clazz4 = classLoader.loadClass("Reflection.Person");
System.out.println(clazz4);
System.out.println(clazz1 == clazz4); //true
}
}