什么叫反射,什么叫正射
正射:正常情况下,我们使用某个类时必定知道他是什么类,用来做什么,我们只需要对这个类进行实例化,之后使用这个类进行操作。
Person person = new Person();
person.setName("apple");
反射:一开始我们并不知道我要初始化的类对象是什么,自然也无法使用new关键字来创建对象了。
Class cas = Class.forName("domain.person");
Constructor constructor = cas.getConstructor();
Object object = constructor.newInstance();
//获取反射类中的方法
Method method = cas.getMethod("setName", String.class);
//设置值
method.invoke(object, "张三");
//获取反射类中的方法
method = cas.getMethod("getName");
//获取值
String s = method.invoke(object).toString();
System.out.println(s);
反射获取对象的步骤
-
获取类的class对象实例(三种方式)
-
通过Class.forName("类的全限定名")静态方法(使用这种方法需知晓该类的全路径名)
Class cas = Class.forName("domain.person");
-
使用.class方法(使用这种方法只适合在编译前就知道操作的class)
Class cas = String.Class;
-
使用类对象的getClass()方法
Class cas = new String("张三").getClass();
-
-
根据Class对象实例获取Constructor对象(通过反射创建类对象的有两种方式)
-
通过Class对象的newInstance()方法
Class cas = Class.forName("domain.person"); person p = (person)cas.newInstance();
-
通过Constructor对象中的newInstance()方法
//获取类 Class cas = person.class; //获取Class的getConstructor Constructor constructor = cas.getConstructor(); //根据Constructor对象的newInstance()方法创建对象 person p = (person)constructor.newInstance();
-
通过Constructor对象创建类对象可以选择特定的构造方法,通过Class对象只能使用默认无参构造方法
-
-
使用Constructor对象的newInstance方法反射类对象(2、3步骤合并)
-
获取类的方法
Method method = cas.getMethod("方法名",对象.Class);
-
调用invoke方法调用方法
method.invoke(object,14);
获取反射类的属性、方法、构造器
-
获取属性
-
通过Class对象的getFields()方法可以获取Class类的属性,但是无法获取私有属性
Class cas = person.class; Field[] fields = cas.getFields(); for (Field field : fields) { System.out.println("属性名称"+field.getName()); } //输入所有属性为public的名称
-
通过Class对象的getDeclaredFileds()方法可以私有属性在内的所有属性;
Class cas = person.class; Field[] fields = cas.getDeclaredFileds(); for (Field field : fields) { System.out.println("属性名称"+field.getName()); } //输入所有属性
-