Java实战指南|Java反射-项目使用场景(二)

这是我参与更文挑战的第30天,活动详情查看: 更文挑战


前言

没想到30天这就过去了啊,意犹未尽,索性自己是坚持了下来,最初写技术文章,是为了督促自己学习成长,时常写写停停,一个不小心就懈怠了,从来也是自己能看懂就ok,很少考虑读者们的感受,后来慢慢的观念改变了,北漂数年总得留下些自己存在的痕迹,今后也会慢慢的沉淀一些技术知识点及平时在项目里所使用的技术工具设计模式等努力写出一些对大家有帮助的好文章,技术之路,不进则退,共勉!

上一期我们初步介绍了一下Java里反射的概念和作用,以及反射的一些初步使用方法,今天我们来看一下反射在项目里的实际使用场景;

反射使用场景

Java的反射机制在平时的业务开发过程中很少使用到,但是在一些基础框架的搭建上应用非常广泛,看源码我们可以发现,在Spring,Mybatis这类框架里都使用了大量的反射操作;

手写一个框架的时候

在搭建框架的时候,有时候不知道需要什么类,什么方法,这个类有哪些属性。比如查询数据库之后的数据,反射成对象。大家可以想象一下我们经常使用的各种数据库交互的各类框架,例如现在在xml配置文件中,定义了要接受一个数据库返回结果集对象为com.wechat.wechatservice.entity.User
我们根据配置,把这组数据,转换成配置中的对象;

代码简单实现:

package com.wechat.wechatservice.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Set;

/**
 * TODO
 *
 * @author taoze
 * @version 1.0
 * @date 6/29/21 2:29 PM
 */
public class MyDataSql {

    /**
     * 假装我们有个XML
     */
    public static String getXmlData() {
        return "com.wechat.wechatservice.entity.User";
    }

    /**
     * 简化数据库查询我们只实现反射
     */
    public static String getDataFromDatabase() {
        return "{\"age\":\"30\",\"name\":\"张三\",\"sex\":\"男\"}\n";
    }

    public static void main(String[] args) throws Exception {
        Class useClass = Class.forName(getXmlData());
        Object needObj = useClass.newInstance();
        JSONObject datas = JSON.parseObject(getDataFromDatabase());
        Set<String> keys = datas.keySet();
        for (String key : keys) {
            Method md = useClass.getMethod("set" + StringUtils.capitalize(key), String.class);
            md.invoke(needObj, datas.get(key));
        }
        System.out.println(needObj);
    }
}

复制代码

运行结果:

图片.png

Java的反射和动态代理机制来实现Spring的AOP。

接口和接口的实现类

public interface UserService {
    void addUser();
    void updateUser();
    void deleteUser();
}
	
public class UserServiceImpl implements UserService {
 
    @Override
    public void addUser() {
        System.out.println("add user");
    }
 
    @Override
    public void updateUser() {
        System.out.println("update user");
    }
 
    @Override
    public void deleteUser() {
        System.out.println("delete user");
    }
 
}
复制代码

切面类MyAspect

public class MyAspect {
    public void befor() {
        System.out.println("befor...");
    }
     
    public void after() {
        System.out.println("after...");
    }
}
复制代码

用来获取目标类的代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
public class MyBeanFactroy {
    public static UserService CreateUserService() {
        // 第一步
        final UserService userService = new UserServiceImpl();
        // 第二步
        final MyAspect myAspect = new MyAspect();
        // 第三步
        UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFactroy.class.getClassLoader(),
                new Class[] { UserService.class }, new InvocationHandler() {
 
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                       //第五步
                        myAspect.befor();
                       //第四步
                        Object obj = method.invoke(userService, args);
                       //第五步
                        myAspect.after();
 
                        return obj;
                    }
                });
 
        return proxyService;
    }
}
复制代码

ok!今天的文章就到这了,希望可以对大家有帮助,有不对的地方希望大家可以提出来的,共同成长;

整洁成就卓越代码,细节之中只有天地

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享