黑马程序员_java 反射

本文深入探讨Java反射机制的核心概念与功能,并通过示例程序展示如何使用反射获取类信息、调用方法和构造对象。重点介绍了Class类、Field类、Method类和Constructor类的使用方法,以及如何通过反射生成类的实例。文章还详细说明了反射在生成对象时的不同构造方法的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  反射是jdk1.2就有的特性,在将来的框架中都要用到反射技术,所谓的反射:就是吧java类中的各种成分映射成相应的java类,因此我们首先要明白什么事java类。在java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class,因此Class类是反射的基石。在这里的Class第一个C是大写的,它不同于我们在编写程序时写的class那个class是小写的,Class类是java类名的名称,Class类的实例对象是代表着一个字节码。所谓字节码就是把一个类的二进制代码加载在内存中即为字节码。用到一种类都会有一份字节码,每一份字节码都是一个Class的实例对象。获取字节码的方法有三种:
1.类名.class                                         例如: System.class
2.对象.getClass()                            例如: new DaTe().getClass
3.Class.forName("类名")                      例如: Class.forName("java.util.Date");     // 实际开发中用的最多的一种方法
 
  在java中存在着9个预定义的Class实例对象分别为:boolean,byte,char,short,int,long,float,double和viod这九种预定义实例对象,他们可以使用上述的第三种方法获取字节码。
  Java反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类;
2.在运行时构造任意一个类的对象;
3.在运行时判断任意一个类所具有的成员变量和方法;
4.在运行时调用任意一个对象的方法。
 
Java Reflection APIs 简介:
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
–Class类:代表一个类
–Field类:代表类的成员变量(成员变量也成为类属性)
–Method类:代表类的方法
–Constructor类:代表类的构造方法
–Array类:提供动态创建数组,以及访问数组的元素的静态方法

Java中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。
两个例子程序:

示例一:
import java.lang.reflect.*;  
 public class DumpMethods 
{  
    public static void main(String[] args) throws Exception
        {  
          Class<?> classType = Class.forName("java.lang.String");      //Class对象描述了某个特定的类对象 
          Method[] methods = classType.getDeclaredMethods();           //通过反射获取到所有的方法 
           for(Method m : methods)                                      //打印所有的方法 
             {                                    
                System.out.println(m);  
             }  
      }  
  
}  

示例二:
import java.lang.reflect.*;  
public class InvokeTester 
{  
  public int add(int parm1, int parm2)
     {  
        return parm1 + parm2;  
     }  
   public String echo(String message)
     {  
        return "hello:" + message;  
     }  
    public static void main(String[] args) throws Exception
      {  
         InvokeTester test = new InvokeTester();  
         System.out.println(test.add(1, 2));  
         System.out.println(test.echo("Java"));  
         Class<?> classType = InvokeTester.class;  
         Object o = classType.newInstance();                          //通过反射生成一个InvokeTester类型的对象  
         Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class });    //通过反射获取到add方法  
         System.out.println(addMethod.invoke(o,new Object[]{1,2}));              //调用对象的add方法并把参数传进去     
         Method echoMethod = classType.getMethod("echo", new Class[]{String.class});           //通过反射获取到echo方法  
         System.out.println(echoMethod.invoke(o, new Object[]{"Java"}));             //调用对象的echo方法并把参数传进去  
    }  
}  

    若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
1)先获得Class对象,然后通过该Class对象的newInstance方法直接获得即可。如
Class<?> classType = String.class; 
Object o = classType.newInstance();
2)先获得Class对象,然后通过该Class对象获得所对应的Constructor对象,再通过该Constructor对象的newInstance方法生成。如
Class<?> classType = Customer.class;
Constructor constructor  =classType.getConstructor(new Class[]{});
Object o1 = constructor.newInstance(new Object[]{});

   若想通过类的带参数的构造方法来生成对象,只能使用下面这种方式:
Class<?> classType = Customer.class;
Constructor constructor2  = classType.getConstructor(new Class[]{String.class,int.class});
Object o2 = constructor.newInstance(new Object[]{"张三",20});








资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 HttpServletRequestWrapper 是 Java Servlet API 中的一个工具类,位于 javax.servlet.http 包中,用于对 HttpServletRequest 对象进行封装,从而在 Web 应用中实现对 HTTP 请求的拦截、修改或增强等功能。通过继承该类并覆盖相关方法,开发者可以轻松地自定义请求处理逻辑,例如修改请求参数、添加请求头、记录日志等。 参数过滤:在请求到达处理器之前,可以对请求参数进行检查或修改,例如去除 URL 编码、过滤敏感信息或进行安全检查。 请求头操作:可以修改或添加请求头,比如设置自定义的 Content-Type 或添加认证信息。 请求属性扩展:在原始请求的基础上添加自定义属性,供后续处理使用。 日志记录:在处理请求前记录请求信息,如 URL、参数、请求头等,便于调试和监控。 跨域支持:通过添加 CORS 相关的响应头,允许来自不同源的请求。 HttpServletRequestWrapper 通过继承 HttpServletRequest 接口并重写其方法来实现功能。开发者可以在重写的方法中添加自定义逻辑,例如在获取参数时进行过滤,或在读取请求体时进行解密。当调用这些方法时,实际上是调用了包装器中的方法,从而实现了对原始请求的修改或增强。 以下是一个简单的示例,展示如何创建一个用于过滤请求参数的包装器: 在 doFilter 方法中,可以使用 CustomRequestWrapper 包装原始请求: 这样,每当调用 getParameterValues 方法时,都会先经过自定义的过滤逻辑。 HttpServletRequestWrapper 是 Java Web 开发中一个强大的工具,它提供了灵活的扩展性,允许开发者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值