Java 反射以及动态代理,来看就懂了

各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题
反射反射机制是 JAVA 语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力 。简单来说就是通过反射,可以在运行期间获取、检测和调用对象的属性和方法 。
反射的使用场景
在现实中反射的使用场景有很多,比如以下几个 。
使用场景一:编程工具 IDEA 或 Eclipse 等,在写代码时会有代码(属性或方法名)提示,就是因为使用了反射 。
使用场景二:很多知名的框架,为了让程序更优雅更简洁,也会使用到反射 。
例如,Spring 可以通过配置来加载不同的类,调用不同的方法,代码如下所示:
<bean id="person" class="com.spring.beans.Person" init-method="initPerson"></bean>
Java 反射以及动态代理,来看就懂了

文章插图
 
例如,MyBatis 在 MApper 使用外部类的 Sql 构建查询时,代码如下所示:
@SelectProvider(type = PersonSql.class, method = "getListSql")List<Person> getList();class PersonSql {    public String getListSql() {        String sql = new SQL() {{            SELECT("*");            FROM("person");        }}.toString();        return sql;    }}
Java 反射以及动态代理,来看就懂了

文章插图
 
使用场景三:数据库连接池,也会使用反射调用不同类型的数据库驱动,代码如下所示:
String url = "jdbc:MySQL://127.0.0.1:3306/mydb";String username = "root";String password = "root";Class.forName("com.mysql.jdbc.Driver");Connection connection = DriverManager.getConnection(url, username, password);
Java 反射以及动态代理,来看就懂了

文章插图
 
当然反射还有其他很多类似的使用场景,这里就不一一列举,读者可以举一反三,想想在平常的开发中,还有哪些使用了反射功能的场景 。
反射的基本使用
下来我们通过反射调用类中的某个方法,来学习反射的基本使用 。
使用反射调用类中的方法,分为三种情况:
  • 调用静态方法
  • 调用公共方法
  • 调用私有方法
假设有一个实体类 MyReflect 包含了以上三种方法,代码如下:
package com.interview.chapter4;class MyReflect {    // 静态方法    public static void staticMd() {        System.out.println("Static Method");    }    // 公共方法    public void publicMd() {        System.out.println("Public Method");    }    // 私有方法    private void privateMd() {        System.out.println("Private Method");    }}
Java 反射以及动态代理,来看就懂了

文章插图
 
下面分别来看,使用反射如何调用以上三种类型的方法 。
① 反射调用静态方法
Class myClass = Class.forName("com.interview.chapter4.MyReflect");Method method = myClass.getMethod("staticMd");method.invoke(myClass);
Java 反射以及动态代理,来看就懂了

文章插图
 
② 反射调用公共方法
Class myClass = Class.forName("com.interview.chapter4.MyReflect");// 创建实例对象(相当于 new )Object instance = myClass.newInstance();Method method2 = myClass.getMethod("publicMd");method2.invoke(instance);
Java 反射以及动态代理,来看就懂了


推荐阅读