反射使用的步骤

简介: 反射使用的步骤

Java反射API有几类?
反射 API 用来生成 JVM 中的类、接口或则对象的信息。

Class 类:反射的核心类,可以获取类的属性,方法等信息。

Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。

Method 类:Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。

Constructor 类:Java.lang.reflec 包中的类,表示类的构造方法。

反射使用的步骤?
获取想要操作的类的Class对象,这是反射的核心,通过Class对象我们可以任意调用类的方法。

调用 Class 类中的方法,既就是反射的使用阶段。

使用反射 API 来操作这些信息。

具体可以看下面的例子:

public class Apple {

private int price;

public int getPrice() {
    return price;
}

public void setPrice(int price) {
    this.price = price;
}

public static void main(String[] args) throws Exception{
    //正常的调用
    Apple apple = new Apple();
    apple.setPrice(5);
    System.out.println("Apple Price:" + apple.getPrice());
    //使用反射调用
    Class clz = Class.forName("com.chenshuyi.api.Apple");
    Method setPriceMethod = clz.getMethod("setPrice", int.class);
    Constructor appleConstructor = clz.getConstructor();
    Object appleObj = appleConstructor.newInstance();
    setPriceMethod.invoke(appleObj, 14);
    Method getPriceMethod = clz.getMethod("getPrice");
    System.out.println("Apple Price:" + getPriceMethod.invoke(appleObj));
}

}
从代码中可以看到我们使用反射调用了 setPrice 方法,并传递了 14 的值。之后使用反射调用了 getPrice 方法,输出其价格。上面的代码整个的输出结果是:

Apple Price:5
Apple Price:14
1
从这个简单的例子可以看出,一般情况下我们使用反射获取一个对象的步骤:

获取类的 Class 对象实例
Class clz = Class.forName("com.zhenai.api.Apple");
根据 Class 对象实例获取 Constructor 对象
Constructor appleConstructor = clz.getConstructor();
使用 Constructor 对象的 newInstance 方法获取反射类对象
Object appleObj = appleConstructor.newInstance();
而如果要调用某一个方法,则需要经过下面的步骤:

获取方法的 Method 对象
Method setPriceMethod = clz.getMethod("setPrice", int.class);
利用 invoke 方法调用方法
setPriceMethod.invoke(appleObj, 14);
为什么引入反射概念?反射机制的应用有哪些?
我们来看一下 Oracle 官方文档中对反射的描述:

从 Oracle 官方文档中可以看出,反射主要应用在以下几方面:

反射让开发人员可以通过外部类的全路径名创建对象,并使用这些类,实现一些扩展的功能。
反射让开发人员可以枚举出类的全部成员,包括构造函数、属性、方法。以帮助开发者写出正确的代码。
测试时可以利用反射 API 访问类的私有成员,以保证测试代码覆盖率。
也就是说,Oracle 希望开发者将反射作为一个工具,用来帮助程序员实现本不可能实现的功能。

举两个最常见使用反射的例子,来说明反射机制的强大之处:

第一种:JDBC 的数据库的连接

在JDBC 的操作中,如果要想进行数据库的连接,则必须按照以上的几步完成

通过Class.forName()加载数据库的驱动程序 (通过反射加载,前提是引入相关了Jar包);
通过 DriverManager 类进行数据库的连接,连接的时候要输入数据库的连接地址、用户名、密码;
通过Connection 接口接收连接。
public class ConnectionJDBC {

/** 
 * @param args 
 */  
//驱动程序就是之前在classpath中配置的JDBC的驱动程序的JAR 包中  
public static final String DBDRIVER = "com.mysql.jdbc.Driver";  
//连接地址是由各个数据库生产商单独提供的,所以需要单独记住  
public static final String DBURL = "jdbc:mysql://localhost:3306/test";  
//连接数据库的用户名  
public static final String DBUSER = "root";  
//连接数据库的密码  
public static final String DBPASS = "";  


public static void main(String[] args) throws Exception {  
    Connection con = null; //表示数据库的连接对象  
    Class.forName(DBDRIVER); //1、使用CLASS 类加载驱动程序 ,反射机制的体现 
    con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、连接数据库  
    System.out.println(con);  
    con.close(); // 3、关闭数据库  
}  


相关文章
通过普通方式调用和反射方式调用以及关闭检测后,通过反射方式调用的性能对比
通过普通方式调用和反射方式调用以及关闭检测后,通过反射方式调用的性能对比
|
前端开发 编译器 容器
|
JavaScript 前端开发 Java
注解与反射5.反射概述
注解与反射5.反射概述
|
XML Java 数据格式
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
159 0
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
|
存储 Java C++
类加载过程和创建对象做了哪些步骤?
类加载过程和创建对象做了哪些步骤?
111 0
类加载过程和创建对象做了哪些步骤?
|
Java 开发者
反射调用普通方法|学习笔记
快速学习反射调用普通方法
116 0
反射调用普通方法|学习笔记
|
C# 索引
C#反射与特性(八):反射操作的示例大全
C#反射与特性(八):反射操作的示例大全
344 0