Java反射API有几类?

举报
上善若水. 发表于 2022/07/25 22:21:10 2022/07/25
【摘要】 Java反射API有几类?

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、关闭数据库  
}  
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。