承接博客JAVA高级---反射机制(一)
4.基于反射获取类信息
通过Field,Constructor.Method类获取类的属性,构造方法和方法
通过.getFields()/getDeclaredFields()方法获取所有属性的field对象(包含类对象属性的名称和类型)
field类对象有getName()和getType()方法展示类对象属性的属性,getFields()方法能获取非privated修饰的属性,而getDeclaredFields()方法能获取所有(包括私有)的属性.
同理,可以通过设置String类型的形参获取指定的属性,同样的一般的getField(String Name)方法只能获取非私有的属性而getDeclaredField(String Name)方法则可以无条件获取指定的属性.
和getFields()/getDeclaredFields()/getField(String Name)/getDeclaredField(String Name)方法类似的还有getMethods()/getDeclaredMethods()/getMethod(String Name)/getDeclaredMethod(String Name)用来获取类的所有方法/指定方法,用法和作用范围与上述一致
此外就是构造方法的调用,构造方法一般有无参构造和有参构造两种,获取无参构造的Constructor对象和能简单,只要使用Class对象的实例方法.getConstructor()方法就能获取,而有参构造对象获取需要加入有参构造形参相对应的Class对象参数才能获取.
5.基于反射生成类的实例
既然Class对象能获取类的构造方法对象,那么就能获取类的实例对象,使用Constructor类的newInstance()方法即可获取一个类的实例对象,下图说明有参构造可以有多个,相应的Class类对应的Constructor对象也可以有复数个,由于这些构造方法对象的创建可能有异常,所以需要try/catch解决异常,需要注意的是通过Class对象获取构造方法对象继而获取实例对象所获得的对象和一般new出来的对象是一样的吗,没有区别.
额外补充
此外,通过实例对象我们能很简单调用对象的实例方法,而我们如果不通过实例对象调用实例方法,则需要使用方法对象的invoke(object o)方法去调用.
5反射的优缺点和应用场景
优点:
运行期类型的判断,动态类加载
提高了程序的灵活性,拓展性,降低耦合性
提高自适应能力,无需提前硬编码目标类
缺点:
性能问题
安全限制
内部暴露