• Java之反射机制


    1. 概述

            JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    2. 反射机制初探

            首先我们做一下准备工作:

    package com.myreflex;
    
    public class Demo {
        private String str1;
        public String str2;
        
        private void fun1(){
            System.out.println("You call fun1");
        }
        public void fun2(){
            System.out.println("You call fun2");
        }
        
        public void fun3(int param1, String param2) {
            System.out.println("You call fun3 with param:"+param1+" and "+param2);
        }
        
        public Demo(int param1, String param2) {
            System.out.println("Consturctor with "+param1+","+param2);
        }
        
        public Demo() {
            System.out.println("Consturctor with no param");
        }
    }

            我们先创建一个测试类,其中包含了一个私有属性、一个公有属性、一个私有方法和一个公有方法。并为这个类准备了三个不同参数构方法。稍后我们要用到这个类。

            (1)通过一个对象获取完整的包名和类名

    package com.myreflex;
    
    public class TestMain {
        
        public static void main(String[] args) {
            Demo demo = new Demo();
            // 通过一个对象获取完整的包名和类名
            System.out.println(demo.getClass().getName()); 
        }
        
    }

            打印结果为:    com.myreflex.Demo。

            (2)实例化一个类

    package com.myreflex;
    
    public class TestMain {
        
        public static void main(String[] args) {
            Class<?> clazz;
            Demo demo = null;
            try {
                clazz = Class.forName("com.myreflex.Demo");
                demo = (Demo) clazz.newInstance(); //通过clazz.newInstance()来实例化Demo
            } catch (InstantiationException e) {
            } catch (IllegalAccessException e) {
            } catch (ClassNotFoundException e1) {
            }
            demo.fun2();
        }
        
    }

            打印结果为:  

    Consturctor with no param
    You call fun2

             但是要注意:此种方法需要Demo拥有无参数的默认构造方法。

            (3)获取类的属性

    package com.myreflex;
    
    import java.lang.reflect.Field;
    
    public class TestMain {
        
        public static void main(String[] args) {
            Class<?> clazz;
            try {
                clazz = Class.forName("com.myreflex.Demo");
                Field[] fields;
                fields = clazz.getFields(); //获取类的所有属性(public)
                System.out.println("--------------getFields----------------");
                for (Field field : fields) {
                    System.out.println(field.getType().getName());
                    System.out.println(field.getName());
                }
                
                fields = clazz.getDeclaredFields(); //获取类的所有属性(public以及private)
                System.out.println("--------------getDeclaredFields----------------");
                for (Field field : fields) {
                    System.out.println(field.getType().getName());
                    System.out.println(field.getName());
                }
            } catch (Exception e) {
                
            }
        }
        
    }

             打印结果为:

    --------------getFields----------------
    java.lang.String
    str2
    --------------getDeclaredFields----------------
    java.lang.String
    str1
    java.lang.String
    str2

            (4)获取类的方法

    package com.myreflex;
    
    import java.lang.reflect.Method;
    
    public class TestMain {
        
        public static void main(String[] args) {
            Class<?> clazz;
            try {
                clazz = Class.forName("com.myreflex.Demo");
                Method[] methods;
                methods = clazz.getMethods(); 
                System.out.println("--------------getMethods----------------");
                for (Method method : methods) {
                    System.out.println(method.getName());
                }
                
                methods = clazz.getDeclaredMethods(); 
                  System.out.println("--------------getDeclaredMethods----------------");
                for (Method method : methods) {
                    System.out.println(method.getName());
                }
            } catch (Exception e) {
                
            }
        }
    }

             打印结果为:

    --------------getMethods----------------
    fun2
    fun3
    wait
    wait
    wait
    equals
    toString
    hashCode
    getClass
    notify
    notifyAll
    --------------getDeclaredMethods----------------
    fun1
    fun2
    fun3

            (5)获取方法的参数类型

    package com.myreflex;
    
    import java.lang.reflect.Method;
    
    public class TestMain {
        
        public static void main(String[] args) {
            Class<?> clazz;
            try {
                clazz = Class.forName("com.myreflex.Demo");
                Method[] methods = clazz.getDeclaredMethods(); 
                for (Method method : methods) {
                    System.out.println(method.getName()+"方法的参数类型有:");
                    Class<?>[] paramClasses = method.getParameterTypes();
                    for (Class<?> paramClass : paramClasses) {
                        System.out.println(paramClass.getName());
                    }
                }
            } catch (Exception e) {
                
            }
        }
    }

             打印结果为:

    fun1方法的参数类型有:
    fun2方法的参数类型有:
    fun3方法的参数类型有:
    int
    java.lang.String

            (6)类方法的调用:

    package com.myreflex;
    
    import java.lang.reflect.Method;
    
    public class TestMain {
        public static void main(String[] args) {
            Class<?> clazz;
            try {
                clazz = Class.forName("com.myreflex.Demo");
                Method method2 = clazz.getDeclaredMethod("fun2"); // 获取fun2的方法
                Method method3 = clazz.getDeclaredMethod("fun3", int.class, String.class); // 获取fun3的方法
                Demo demo = (Demo) clazz.newInstance(); // 创建一个Demo的实例
                method2.invoke(demo); // 执行fun2
                method3.invoke(demo, 111, "aaa"); // 执行fun3
            } catch (Exception e) {
            }
        }
    }

            (7)获取父类

    package com.myreflex;
    
    public class TestMain {
        public static void main(String[] args) {
            Class<?> clazz;
            try {
                clazz = Class.forName("com.myreflex.Demo");
                clazz = clazz.getSuperclass();
                System.out.println(clazz.getName());
            } catch (Exception e) {
            }
        }
    }

              打印结果为:java.lang.Object。

            (8)获取全部构造函数

    package com.myreflex;
    
    import java.lang.reflect.Constructor;
    
    public class TestMain {
        public static void main(String[] args) {
            Class<?> clazz;
            try {
                clazz = Class.forName("com.myreflex.Demo");
                Constructor<?>[] cons = clazz.getConstructors();
                for (Constructor<?> constructor : cons) {
                    System.out.println(constructor);
                }
            } catch (Exception e) {
            }
        }
    }

            打印结果为:

    public com.myreflex.Demo()
    public com.myreflex.Demo(int,java.lang.String)

            (9)未完待续

            …………………

    笔者只是初学者,开此博客的初衷是为了给自己的学习过程留一个痕迹。所以您可能发现笔者措辞不严谨、逻辑不合理,甚至代码有错误、结论很偏颇等等。笔者感激各位的讨论和指正,并在此不胜感激!拜谢!欢迎加QQ群讨论:852410026
  • 相关阅读:
    UOJ222 【NOI2016】区间
    BZOJ3631 [JLOI2014]松鼠的新家
    BZOJ 1001 [BeiJing2006]狼抓兔子
    poj2488 A Knight's Journey裸dfs
    hdu 4289 网络流拆点,类似最小割(可做模板)邻接矩阵实现
    hdu 4183 EK最大流算法
    HDU 4180 扩展欧几里得
    HDU 4178 模拟
    HDU 4177 模拟时间问题
    hdu 4185 二分图最大匹配
  • 原文地址:https://www.cnblogs.com/LOVE0612/p/5225552.html
Copyright © 2020-2023  润新知