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);
            
        }
    }
  • 相关阅读:
    Go语言指针
    程序员 需要掌握得600个英语单词
    Go语言管道
    Go语言容器
    Go语言切片
    Go语言类型转换
    Go语言数组
    LR静态存储/动态存储/指针变量脚本说明
    MQ报错2009/2085解决方法
    Windows性能监控监视器(perfmon使用)
  • 原文地址:https://www.cnblogs.com/xlwu/p/13612770.html
Copyright © 2011-2022 走看看