zoukankan      html  css  js  c++  java
  • java 反射

    Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。这对于程序的检查工具和调试器来说,是非常实用的功能。只需要短短的十几行代码,就可以遍历出来一个Java类的内部结构,包括其中的构造方法、声明的域和定义的方法等。这不得不说是一个很强大的能力。只要有了java.lang.Class类 的对象,就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是getConstructorgetFieldgetMethod。这三个方法还有相应的getDeclaredXXX版本,区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素,而不会考虑继承下来的。ConstructorFieldMethod这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。

    反射API的另外一个作用是在运行时刻对一个Java对象进行操作。 这些操作包括动态创建一个Java类的对象,获取某个域的值以及调用某个方法。在Java源代码中编写的对类和对象的操作,都可以在运行时刻通过反射API来实现。

    今天做了个小示例

    package com.example;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class Example {
        
        /**
         * @param args
         */
        public static void main(String[] args) {        
            try{
                /*
                User user = new User();
                user.setId(1001);
                user.setName("evil rogue studio");
                user.setAge(25);
                */
                Class<?> clazz = Class.forName("com.example.User");
                //Class<?> clazz = new User().getClass();
                
                Method[] methods = clazz.getDeclaredMethods();
                for (Method method : methods) {  
                    System.out.println("方法:"+method);  
                }  
                
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {
                    System.out.println("字段:" + field);
                }
           /**
            * 执行带参数的构造函数来新建实例的方法
            */
           //Constructor cons = clazz.getConstructor(parameterTypes);
           //
    User user = (User) cons.newInstance(args);
                User user = (User) clazz.newInstance();
            
                Method method = clazz.getMethod("add",new Class<?>[]{int.class,int.class});  
                int result = (Integer)method.invoke(user, new Object[]{3,9});  
                System.out.println("add 结果:"+result);  
                
                Method method2 = clazz.getDeclaredMethod("sub",new Class<?>[]{int.class,int.class});  
                method2.setAccessible(true);
                int result2 = (Integer)method2.invoke(user, new Object[]{13,9});  
                System.out.println("sub 结果:"+result2);  
                
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    package com.example;
    
    public class User {
    
        private long id;
        private String name;
        private int age;
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        /**
         * 加法
         * 
         * @param a
         * @param b
         * @return
         */
        public int add(int a, int b) {
            return a + b;
        }
    
        /**
         * 减法
         * 
         * @param a
         * @param b
         * @return
         */
        private int sub(int a, int b) {
            return a - b;
        }
    }
  • 相关阅读:
    注解-案例
    注解(Annotation)
    适合新手看的超详细CentOS Linux 7 安装Tomcat8过程
    CentOS Linux 7 提示 lsof: 未找到命令
    解决MySql报错:1130
    Spring Boot 创建自定义的properties文件
    spring boot 使用Schedule创建轻量级定时任务
    4.Java数组模块
    3.IDEA开发工具
    2.java基础语法
  • 原文地址:https://www.cnblogs.com/evilrogue/p/2880987.html
Copyright © 2011-2022 走看看