反射的使用

  1. 反射

Java的反射(reflection)机制是指在程序的运行过程中,可以创建任意类的对象

对于任意一个类,了解类的信息以及属性和方法

对于任意一个对象,可以调用对象的属性和方法

这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。

  1. 反射机制相关的类

   类加载时,JVM自动生成类的Class类对象。

   将类的成员进行拆分,拆分成一个个对象。

描述

Class

代表类对象

Field

代表属性对象

Constructor

代表构造方法对象

Method

代表方法对象

  1. 创建Class类对象三种方式

   Class.forName(“全限定名”);   //全限定名:包名+类名  (推荐)

   类名.class ;

   对象名.getClass();

  1. Class类对象常用的方法

   1. 获取类的包名、类名、修饰符....基本信息的方法

方法名

描述

getPackageName()

获取包名

getName()

获取全限定名.(包名+类名)

getSimpleName()

获取类名

getModifiers()

获取修饰符

getSuperclass()

获取父类

getInterfaces()

获取实现的父接口

   2. 获取构造方法对象 Constructor

方法名

描述

getConstructor(<?>... parameterTypes)

获取指定的公共的构造方法

getConstructors()

获取所有的公共的构造方法

getDeclaredConstructor(<?>... parameterTypes)

获取指定的构造方法

getDeclaredConstructors()

获取所有的构造方法

   构造方法对象常用的方法

方法名

描述

getModifiers()

获取修饰符

getName()

获取构造方法名

getParameterCount()

获取参数个数

newInstance()

创建对象

   

    3. 获取属性对象 Field

方法名

描述

getField(String name)

获取指定的公共的属性对象

getFields()

获取所有的公共的属性对象

getDeclaredField(String name)

获取指定的属性对象

getDeclaredFiles()

获取所有的属性对象

      属性对象常用的方法

方法名

描述

getModifiers()

获取修饰符

getType()

获取数据类型

getName()

获取属性名

set(Object obj ,Object value)

给指定对象的属性赋值

get(Object obj)

获取指定对象的属性值

   4. 获取方法对象 Method

方法名

描述

getMethod(String name, <?>... parameterTypes)

获取指定的公共的方法对象

getMethods()

获取所有的公共的方法对象

getDeclaredMethod(

String name, <?>... parameterTypes)

获取指定的方法对象

getDeclaredMethods()

获取所有的方法对象

          方法对象常用的方法

方法名

描述

getModifiers()

获取修饰符

getReturnType()

获取返回值类型

getName()

获取方法名

getParameterCount()

获取参数个数

invoke(Object obj,Object...args)

调用方法

  1. 私有化成员访问,设置忽略访问修饰符

setAccessible(true);

  1. 反射应用

  应用场景:当程序运行时才能确定创建对象,需要用反射。

  好处:提高程序的灵活性可扩展性,降低耦合性。

应用场景:模拟Servlet底层实现

  1. 写一个java类,实现Servlet接口

   重写service()方法,处理请求

public class AddEmpServlet implements Servlet{
    @Override
    public void service() {
        System.out.println("添加员工....");
    }
}

  1. web.xml配置Servlet的访问路径

<servlet>
    <servlet-name>addEmpServlet </servlet-name>
    <servlet-class>com.bdqn.servlet.AddEmpServlet </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>addEmpServlet </servlet-name>
    <url-pattern>/addEmp</url-pattern>
</servlet-mapping>

 执行原理:

  1. 当服务器启动时,加载web.xml文件。获取 url-->serlvet的映射关系

   当你访问哪一个url路径,创建对应的Servlet

  1. 当输入url访问路径时,找到对应Servlet。
  2. 创建Servlet对象,调用service()方法处理请求
Java反射可以让我们在运行时获取和操作类的信息,包括类的属性、方法、构造函数等。下面是一个使用Java反射的简单案例: 假设我们有一个类Person: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void sayHello() { System.out.println("Hello, my name is " + name + ", I am " + age + " years old."); } } ``` 现在,我们可以使用反射来获取和调用Person类的构造函数和方法: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectionExample { public static void main(String[] args) throws Exception { // 获取Person类的Class对象 Class<Person> personClass = Person.class; // 获取Person类的构造函数 Constructor<Person> constructor = personClass.getConstructor(String.class, int.class); // 使用构造函数创建Person对象 Person person = constructor.newInstance("Tom", 20); // 获取Person类的sayHello方法 Method sayHelloMethod = personClass.getMethod("sayHello"); // 调用sayHello方法 sayHelloMethod.invoke(person); } } ``` 以上代码中,我们首先通过`Person.class`获取了Person类的Class对象,然后使用`getConstructor`方法获取了Person类的构造函数,并使用构造函数创建了一个Person对象。接着,我们使用`getMethod`方法获取了Person类的`sayHello`方法,并使用`invoke`方法调用了该方法。最终,我们输出了`Hello, my name is Tom, I am 20 years old.`。 这只是一个简单的反射案例,实际上Java反射还可以做很多其他的事情,比如动态代理、注解处理等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值