反射

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反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
使用反射会模糊程序内部逻辑:
程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。


7.【上机】使用反射模拟请求调用不同的Servlet实例。

原文地址:https://www.cnblogs.com/ren549047861/p/11294301.html