反射技术在项目中的应用

概述:通过反射技术执行相应的方法
数据库

/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 8.0.18 : Database - demo
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`demo` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `demo`;

/*Table structure for table `account` */

DROP TABLE IF EXISTS `account`;

CREATE TABLE `account` (
  `aid` int(11) NOT NULL AUTO_INCREMENT,
  `aname` varchar(20) DEFAULT NULL,
  `password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '123',
  `sex` enum('男','女') DEFAULT NULL,
  `cardnum` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `rid` int(11) DEFAULT NULL,
  PRIMARY KEY (`aid`),
  UNIQUE KEY `aname` (`aname`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8;

/*Data for the table `account` */

insert  into `account`(`aid`,`aname`,`password`,`sex`,`cardnum`,`rid`) values (1,'admin','123','男',NULL,2),(2,'lily','123',NULL,'1111',1),(3,'rose','123','男','2222',1),(4,'lucy','123',NULL,NULL,1),(5,'tom','123',NULL,'3333',1),(6,'jack','123',NULL,NULL,1);


/*Table structure for table `menu` */

DROP TABLE IF EXISTS `menu`;

CREATE TABLE `menu` (
  `mid` int(11) NOT NULL AUTO_INCREMENT,
  `mname` varchar(20) DEFAULT NULL,
  `murl` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `fmid` int(11) DEFAULT NULL,
  `level` int(11) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  KEY `mid` (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

/*Data for the table `menu` */

insert  into `menu`(`mid`,`mname`,`murl`,`fmid`,`level`,`status`) values (1,'登录','/account.do?method=query',6,1,2),(2,'用户添加','cn.kgc.tangcco.service.AccountService',7,1,2),(3,'用户列表','cn.kgc.tangcco.service.AccountService',8,1,2),(4,'角色添加','cn.kgc.tangcco.service.RoleService',0,1,2),(5,'角色列表','cn.kgc.tangcco.service.RoleService',0,1,2),(6,'菜单列表','cn.kgc.tangcco.service.MenuService',0,1,2),(7,'注册','/kkk.do',0,1,2),(8,'查询角色所关联的菜单',NULL,0,11,2);

/*Table structure for table `menu_fanshe` */

DROP TABLE IF EXISTS `menu_fanshe`;

CREATE TABLE `menu_fanshe` (
  `mid` int(11) NOT NULL DEFAULT '0',
  `mname` varchar(20) DEFAULT NULL,
  `murl` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `fmid` int(11) DEFAULT NULL,
  `level` int(11) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  `method` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `menu_fanshe` */

insert  into `menu_fanshe`(`mid`,`mname`,`murl`,`fmid`,`level`,`status`,`method`) values (1,'登录','/account.do?method=query',6,1,2,NULL),(2,'用户添加','cn.kgc.tangcco.service.AccountService',7,1,2,'addaccount'),(3,'用户删除','cn.kgc.tangcco.service.AccountService',8,1,2,'delaccount'),(4,'角色添加','cn.kgc.tangcco.service.RoleService',0,1,2,'addrole'),(5,'角色删除','cn.kgc.tangcco.service.RoleService',0,1,2,'delrole'),(6,'菜单添加','cn.kgc.tangcco.service.MenuService',0,1,2,'addmenu'),(7,'菜单删除','/kkk.do',0,1,2,'delmenu'),(8,'查询角色所关联的菜单',NULL,0,11,2,NULL);

/*Table structure for table `role` */

DROP TABLE IF EXISTS `role`;

CREATE TABLE `role` (
  `rid` int(11) NOT NULL AUTO_INCREMENT,
  `rname` varchar(20) DEFAULT NULL,
  `remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`rid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

/*Data for the table `role` */

insert  into `role`(`rid`,`rname`,`remark`) values (1,'普通员工',NULL),(2,'超级管理员',NULL);

/*Table structure for table `role_menu` */

DROP TABLE IF EXISTS `role_menu`;

CREATE TABLE `role_menu` (
  `rmid` int(11) NOT NULL AUTO_INCREMENT,
  `rid` int(11) DEFAULT NULL,
  `mid` int(11) DEFAULT NULL,
  PRIMARY KEY (`rmid`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;

/*Data for the table `role_menu` */

insert  into `role_menu`(`rmid`,`rid`,`mid`) values (1,1,1),(2,1,3),(3,1,5),(4,1,7),(5,2,2),(6,2,3),(7,2,4),(8,2,5),(9,2,6),(10,2,8);


Account2

package cn.kgc.tangcco.manager;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account2 {
	private int aid;
	private String aname;
	private String password;
	private String sex;
	private String cardnum;
	private int rid;
	private String rname;
	private String remark;
}

Menu

package cn.kgc.tangcco.manager;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Menu {
	private int mid;
	private String mname;
	private String murl;
	private String method;
}

AccountService

package cn.kgc.tangcco.service;

/**
 * 用户的业务类
 * 
 * @author dell
 *
 */
public class AccountService {

	public void addaccount() {
		System.out.println("AccountService类中用户添加功能");
	}

	public void selaccount() {
		System.out.println("AccountService类中用户查询功能");
	}

	public void delaccount() {
		System.out.println("AccountService类中用户删除功能");
	}

	public void upaccount() {
		System.out.println("AccountService类中用户修改功能");
	}
}

MenuService

package cn.kgc.tangcco.service;

/**
 * 菜单的业务类
 * 
 * @author dell
 *
 */
public class MenuService {
	public void addmenu() {
		System.out.println("MenuService类中菜单添加功能");
	}

	public void selmenu() {
		System.out.println("MenuService类中菜单查询功能");
	}

	public void delmenu() {
		System.out.println("MenuService类中菜单删除功能");
	}

	public void upmenu() {
		System.out.println("MenuService类中菜单修改功能");
	}
}

RoleService

package cn.kgc.tangcco.service;

/**
 * 角色的业务类
 * 
 * @author dell
 *
 */
public class RoleService {
	public void addrole() {
		System.out.println("RoleService类中角色添加功能");
	}

	public void selrole() {
		System.out.println("RoleService类中角色查询功能");
	}

	public void delrole() {
		System.out.println("RoleService类中角色删除功能");
	}

	public void uprole() {
		System.out.println("RoleService类中角色修改功能");
	}
}

TestDemo

package cn.kgc.tangcco.manager;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Scanner;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 查询用户不同,角色不同,显示出不同的菜单 通过数据库的分析---- admin---管理员----(用户,角色,菜单)(查询,添加,删除)
 * lily----普通员工----(用户,角色,菜单) (查询)
 * 
 * @author dell
 *
 */
public class TestDemo {
	// 1.建立连接改为用数据库连接池,通过c3p0-config.xml
	static ComboPooledDataSource datasource = new ComboPooledDataSource();
	// 2.从连接池中获取一个连接,对sql语句进行处理的操作改为用dbutils技术,加载jar包
	static QueryRunner qr = new QueryRunner(datasource);

	public static void main(String[] args) {

		// 3.如果执行
		try {
			Scanner sc = new Scanner(System.in);
			System.out.println("请输入用户名:");
			String username = sc.next();
			System.out.println("请输入密码:");
			String password = sc.next();
			// 查询用户是否存在,存在的话是什么角色,再根据角色显示菜单|不存在就要给出提示
			String sql = "SELECT account.*,role.rname,role.remark FROM account LEFT JOIN role ON account.rid=role.rid where aname=? and password=? ";
			Account2 account2 = qr.query(sql, new BeanHandler<Account2>(Account2.class), username, password);
			if (account2 != null) {
				// 存在
				System.out.println("当前登录用户是:" + account2.getAname() + ",所属角色:" + account2.getRname());
				menu(account2);
			} else {
				// 不存在
				System.out.println("输入的用户和密码有误");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 根据用户及他的角色显示菜单(菜单表没有角色,所有要和role_menu表关联)
	public static void menu(Account2 account2) throws Exception {

		// 根据用户对应的角色去关联菜单,
		// sql书写时只需要菜单menu和关联表role_menu关联就有菜单信息和角色id
		String sql = "select * from menu_fanshe m left join role_menu rm on m.mid=rm.mid" + " where rm.rid=?";
		List<Menu> menulist = qr.query(sql, new BeanListHandler<Menu>(Menu.class), account2.getRid());
		// 显示的是当前用户登录进来后看到的菜单
		for (int i = 0; i < menulist.size(); i++) {
			System.out.println((i + 1) + ":" + menulist.get(i)); // 显示菜单的所有信息
			// System.out.println((i+1)+":"+menulist.get(i).getMname());//只会显示菜单名称
		}

		// -----------------------------------------------------
		System.out.println("请输入功能号:");
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();

		Menu m = menulist.get(n - 1);
		System.out.println("你选择的菜单是:" + m);
		//通过路径获取class对象
		Class clazz = Class.forName(m.getMurl());
		//相当于new RoleService()| new MeuService()|new AccountService()
		Object obj = clazz.newInstance();
		//通过方法名获取Method对象
		Method method = clazz.getDeclaredMethod(m.getMethod());
		//抑制Java的访问控制检查,默认为false
		method.setAccessible(true);
		//执行obj的method方法
		method.invoke(obj);

	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值