1.什么情况下需要使用反射?
在编译时无法知道该对象或类属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息。此时用反射。
2.Class类的作用及其主要功能?
我们说类是对象的设计图,像User类,Person类,Student类,每个类可以创建多个对象。而Class类是谁的设计图呢?Class类是类的设计图?也就是说,User类,Person类,Student类等每个类都是一个Class类的实例,在运行时都对应着一个Class对象。
Class类提供了很多方法,比如反射技术常用到的Class.forName("包.类(如User类)");这样可以获取User类的Class对象。通过这个Class对象,我们可以调用User类的方法,属性,构造方法等。
3.如何使用反射创建一个对象?
方法一:使用Class的newInstance()方法,仅适用于无参构造方法;
示例代码:
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
User u=clazz.newInstance();
方法二:调用Constructor的newInstance()方法,适用所有构造方法;
示例代码:
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
Constructor<User> cons = clazz.getConstructor(int.class,int.class, String.class,String.class );
User u= cons.newInstance( 1001,19,"王一一","男");
4.如何使用反射操作属性?
操作属性基本步骤:
1.通过Class对象获取Field(属性)对象;
2.调用Field对象的方法操作属性;
代码示例:
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
//获得User类里属性名为”name”的属性并将其封装成一个Field对象name,接下来可//以用name调用Field的方法来操作属性;(略)
Field name=clazz.getField(“name”);
通过Class对象获得属性的方法有:
获取public的属性:object.getFields()
获取所有的属性: object.getDeclaredFields()
根据属性名称获取public的属性信息: object.getField(“sex”);
根据属性名称获取属性的信息:object.getDeclaredField(“name”);
5.如何使用反射执行方法?
调用方法基本步骤:
1.通过Class对象获取Method 对象;
2.调用Method对象的invoke()方法;
代码示例:
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
User u=clazz.newInstance();
Method m2=clazz.getDeclaredMethod("show", String.class);
Object o=m2.invoke(u, "大家好");
System.out.println(o);
6.反射的优缺点有哪些?
优点:
反射提高了Java程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
反射是其它一些常用语言,如C、C++、Fortran 或者Pascal等都不具备的。
Java反射技术应用领域很广,如软件测试、 EJB、JavaBean等。
许多流行的开源框架例如Struts、Hibernate、Spring在实现过程中都采用了该技术。
缺点:
性能问题:
使用反射基本上是一种解释操作,字段和方法接入时要远慢于直接代码。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
使用反射会模糊程序内部逻辑:
程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。