美文网首页
【java笔记】反射的简单应用

【java笔记】反射的简单应用

作者: 李明燮 | 来源:发表于2020-08-10 18:10 被阅读0次

    今天在代码中看到了invoke方法,了解到原来是使用了反射的机制。
    以前没怎么用过这种方式,所以简单的了解一下。

    具体内容是简单的写了一套代码。

    声明Animal类

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    class Animal {
        public Animal() {
        }
    
        public Animal(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        private int age;
        public String name;
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    

    普通的方法和使用反射

        @SuppressWarnings("unchecked")
        public void fanshe() throws Exception {
            try {
                System.out.println("-----------正常调用----------");
                Animal animal = new Animal();
                animal.setAge(10);
                System.out.println("animal age:" + animal.getAge());
    
                System.out.println("-----------使用反射----------");
                // 获取需调用的类
                Class clz = Class.forName("Animal");
                // 获取需调用的函数
                Method setPriceMethod = clz.getMethod("setAge", int.class);
                // 根据class的实例,获取Constructor实例
                Constructor animalConstructor = clz.getConstructor();
                // 根据Constructor实例的newInstance(),获取反射类
                Object animalObj = animalConstructor.newInstance();
                // 使用invoke方法调用反射类的函数
                setPriceMethod.invoke(animalObj, 15);
                // 只调用方法,只需要下面两个步骤
                Method getPriceMethod = clz.getMethod("getAge");
                Object age = getPriceMethod.invoke(animalObj);
                System.out.println("animal age:" + age);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    

    反射的常用方法

        @SuppressWarnings("unchecked")
        public void fansheTest() throws Exception {
            try {
                // 使用.forName 获取类的对象
                Class clz1 = Class.forName("java.lang.String");
                System.out.println("-----------Class1----------");
                System.out.println(clz1);
    
    
                // 使用 .class 获取类的对象
                Class clz2 = String.class;
                System.out.println("-----------Class2----------");
                System.out.println(clz2);
    
                // 实例的 .getClass 获取类对象
                String str = new String("Hello");
                Class clz3 = str.getClass();
                System.out.println("-----------Class3----------");
                System.out.println(clz3);
    
    
                // 获取反射类,直接调用class的 newInstance()方法获取
                Class clz4 = Animal.class;
                Animal animal4 = (Animal) clz4.newInstance();
                System.out.println("-----------Class4----------");
                System.out.println(animal4.getClass());
    
                // 获取反射类,通过Constructor的newInstance()方法获取
                Class clz5 = Animal.class;
                Constructor constructor5 = clz5.getConstructor();
                Animal animal5 = (Animal) constructor5.newInstance();
                System.out.println("-----------Class5----------");
                System.out.println(animal5.getClass());
    
                // 获取反射类,指定构造函数的时候
                Class clz6 = Animal.class;
                Constructor constructor6 = clz4.getConstructor(String.class, int.class);
                Animal animal6 = (Animal) constructor6.newInstance("马", 15);
                System.out.println("-----------Class6----------");
                System.out.println(animal6.getClass());
    
    
                Class clz = Animal.class;
                // 获取类的属性(查不到private属性)
                Field[] fields1 = clz.getFields();
                System.out.println("-----------fields1----------");
                for (Field field : fields1) {
                    System.out.println(field.getName());
                }
    
                // 获取声明的类所有属性
                System.out.println("-----------fields2----------");
                Field[] fields2 = clz.getDeclaredFields();
                for (Field field : fields2) {
                    System.out.println(field.getName());
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }
    

    main里执行

    public class main {
        public static void main(String[] args){
            Animal animal = new Animal();
            try{
                animal.fanshe();
                animal.fansheTest();
            }catch (Exception e){
                System.out.println(e.getMessage());
            }
        }
    }
    
    

    编译以后,可以查看结果

    $ javac main.java
    
    $ java main
    -----------正常调用----------
    animal age:10
    -----------反射调用----------
    animal age:15
    -----------Class1----------
    class java.lang.String
    -----------Class2----------
    class java.lang.String
    -----------Class3----------
    class java.lang.String
    -----------Class4----------
    class Animal
    -----------Class5----------
    class Animal
    -----------Class6----------
    class Animal
    -----------fields1----------
    name
    -----------fields2----------
    age
    name
    

    欢迎大家的意见和交流

    email: li_mingxie@163.com

    相关文章

      网友评论

          本文标题:【java笔记】反射的简单应用

          本文链接:https://www.haomeiwen.com/subject/hdljrktx.html