zoukankan      html  css  js  c++  java
  • 通过反射机制获取class中的方法

    用户业务类:

    package com.javaSe.Service;
    /*
    用户业务类
    */
    
    
    public class UserService {
        /**
         * 登陆方法
         * @param name 用户名
         * @param password 密码
         * @return true表示登陆成功,false表示登陆失败!
         */
        public boolean login(String name,String password){
            if ("admin".equals(name) && "123".equals(password)){
                return true;
            }
            return false;
        }
        
        // 可能还有一个同名的login方法
        // java中怎么区分一个方法,依靠方法名和参数列表。
        public void login(int i){
        
        }
        
        /**
         * 退出系统方法
         */
        public void logout(){
            System.out.println("系统已经安全退出!");
        }
    }

    如何获取Class文件中的方法:

    package com.javaSe.reflect;
    
    
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    
    
    /*
    作为了解内容(不需要掌握):
        反射Method
    */
    public class ReflectTest08 {
        public static void main(String[] args) throws Exception{
            // 获取类
            Class userServiceClass = Class.forName("com.javaSe.Service.UserService");
            
            // 获取所有的Method(包括所有私有的!)
            Method[] methods = userServiceClass.getDeclaredMethods();
            System.out.println(methods.length); // 2
            
            // 遍历Method
            for (Method method : methods){
                
                // 获取修饰符列表
                System.out.println(Modifier.toString(method.getModifiers()));
                
                // 获取方法的返回值类型
                System.out.println(method.getReturnType().getSimpleName());
                
                // 获取方法名
                System.out.println(method.getName());
                
                // 方法的修饰符列表(一个方法的参数可能会有多个)
                Class[] parameterTypes = method.getParameterTypes();
                for (Class parameterType : parameterTypes){
                    System.out.println(parameterType.getSimpleName());
                }
            }
        }
    }

    反编译一个类中的方法:

    package com.javaSe.reflect;
    
    
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    
    
    /*
    了解一下,不需要掌握(反编译一个类的方法)
    */
    public class ReflectTest09 {
        public static void main(String[] args) throws Exception{
            StringBuilder s = new StringBuilder();
            Class userServiceClass = Class.forName("com.javaSe.Service.UserService");
            // Class userServiceClass = Class.forName("java.lang.String");
            s.append(Modifier.toString(userServiceClass.getModifiers()) + " class " + userServiceClass.getSimpleName() + " {
    ");
                    //修饰符                                                           类名
            Method[] methods = userServiceClass.getDeclaredMethods();// 获取整个class中的方法
            for(Method method : methods){
                s.append("	");
                s.append(Modifier.toString(method.getModifiers()));// 修饰符
                s.append(" ");
                s.append(method.getReturnType().getSimpleName()); // 返回值列表
                s.append(" ");
                s.append(method.getName()); // 方法名
                s.append("(");
                
                // 参数列表
                Class[] parameterTypes = method.getParameterTypes();
                for (Class parameterType : parameterTypes){
                    s.append(parameterType.getSimpleName()); // 参数类型
                    s.append(",");
                }
                
                // 删除指定下标位置上的字符
                s.deleteCharAt(s.length() - 1);
                s.append("){}
    ");
            }
            
            s.append("}");
            System.out.println(s);
        }
    }

    根据反射机制调用一个类中的方法并获取返回值:

    package com.javaSe.reflect;
    
    
    import com.javaSe.Service.UserService;
    
    
    import java.lang.reflect.Method;
    
    
    /*
    重点:必须掌握,通过反射机制怎么调用一个对象的方法?
        五颗星 *****
        
        反射机制,让代码很具有通用性,可变化的内容都是写到配置文件当中,将来修改配置文件之后,创建的对象不一样了,调用的方法也不同了,
        但是java代码不需要做任何的改动。这就是反射机制的魅力。
    */
    public class ReflectTest10 {
        public static void main(String[] args) throws Exception{
            // 不使用反射机制,怎么调用方法
            // 创建对象
            UserService userService = new UserService();
            // 调用方法
            /*
            要素分析:
                要素1:对象UserService
                要素2:login方法名
                要素3:实参列表
                要素4:返回值
             */
            boolean loginSuccess = userService.login("admin","123");
            System.out.println(loginSuccess ? "登陆成功" : "登陆失败");
            
            // 使用反射机制来调用一个对象的方法该怎么做?
            Class userServiceClass = Class.forName("com.javaSe.Service.UserService");
            // 创建对象
            Object obj = userServiceClass.newInstance();
            // 获取Method
            Method loginMethod = userServiceClass.getDeclaredMethod("login",String.class,String.class);
            // Method loginMethod = userServiceClass.getDeclaredMethod("login",int.class);
            // 调用方法
            // 调用方法要几个要素?也需要4要素
            // 反射机制中最最最最最最最重要的一个方法,必须记住。
            // 四要素:loginMethod方法
            //        obj对象
            //        "admin","123" 实参
            //        retValue 返回值
            Object retValue = loginMethod.invoke/*调用*/(obj,"admin","123");
            System.out.println(retValue);
            
        }
    }
  • 相关阅读:
    CSS3 target伪类简介
    不用position,让div垂直居中
    css3 在线编辑工具 连兼容都写好了
    a标签伪类的顺序
    oncopy和onpaste
    【leetcode】1523. Count Odd Numbers in an Interval Range
    【leetcode】1518. Water Bottles
    【leetcode】1514. Path with Maximum Probability
    【leetcode】1513. Number of Substrings With Only 1s
    【leetcode】1512. Number of Good Pairs
  • 原文地址:https://www.cnblogs.com/xlwu/p/13612770.html
Copyright © 2011-2022 走看看