zoukankan      html  css  js  c++  java
  • 菜鸟学Java(十五)——Java反射机制(二)

    上一篇博文《菜鸟学编程(九)——Java反射机制(一)》里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用。上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈,还是结合一些实例比较形象具体。那么今天就结合更多的实例具体说说。


    实例一:获得完整的类名

    package reflection.getclassname;
    
    //获得完整的类名
    public class GetClassName {
    
        public String getNameByClass() {
            
            String name = "";
            System.out.println("通过类本身获得对象");
            Class UserClass = this.getClass();
            System.out.println("获得对象成功!
    ");
            
            System.out.println("通过类对象获得类名");
            name = UserClass.getName();
            System.out.println("获得类名成功!");
            return name;
        }
        public static void main(String[] args) {
            
            GetClassName gcn = new GetClassName();
            System.out.println("类名为:"+gcn.getNameByClass());
        }
    
    }

    运行结果:

    通过类本身获得对象
    获得对象成功!

    通过类对象获得类名
    获得类名成功!
    类名为:reflection.getclassname.GetClass Name       



     

     

     

     

     

    实例二:获得类的属性

    package reflection.getfields;
    
    import java.lang.reflect.Field;
    
    //获得类的属性
    public class GetFields {
    
        public static void getFieldNames(String className) {
            
            try {
                //获得类名
                Class c = Class.forName(className);
                //获得所有属性
                Field[] fds = c.getFields();
                
                for (int i=0; i<fds.length; i++)
                {
                    String fn = fds[i].getName();
                    Class tc = fds[i].getType();
                    String ft = tc.getName();
                    System.out.println("该属性的名字为:"+fn+",该属性的类型为:"+ft);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) {
            GetFields.getFieldNames("reflection.getfields.FieldInfo");
        }
    
    }

    运行结果:

    该属性的名字为:id,该属性的类型为:java.lang.String

    该属性的名字为:username,该属性的类型为:java.lang.String    



     

     

    实例三:获得类实现的接口

    package reflection.getinterfaces;
    
    //获得类实现的接口
    public class GetInterfaces {
    
        public static void getInterfaces(String className) {
            try {
                //取得类
                Class cl = Class.forName(className);
                Class[] ifs = cl.getInterfaces();
                for (int i = 0; i<ifs.length;i++)
                {
                    String IName = ifs[i].getName();
                    System.out.println("该类实现的接口名字为:"+IName);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) {
            GetInterfaces.getInterfaces("reflection.getinterfaces.Student");
        }
    
    }

    运行结果:

    该类实现的接口名字为:reflection.getinterfaces.Person    



     

    实例四:获得类及其属性的修饰符

    package reflection.getmodifiers;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    import reflection.UserInfo;
    
    //获得类及其属性的修饰符
    public class GetModifiers {
    
        private String username = "liu shui jing";
        float f = Float.parseFloat("1.000");
        public static final int i = 37;
        
        //获得类的修饰符
        public static String useModifiers(UserInfo ui) {
            
            Class uiClass = ui.getClass();
            int m = uiClass.getModifiers();
            return Modifier.toString(m);
            
        }
        
        //获得本类属性的修饰符
        public void checkThisClassModifiers() {
            
            Class tc = this.getClass();        
            Field fl[] = tc.getDeclaredFields();
        
            for(int i=0;i<fl.length;i++)
            {
                System.out.println("第"+(i+1)+"个属性的修饰符为:"+Modifier.toString(fl[i].getModifiers()));
            }
            
        }
        public static void main(String[] args) {
            
            //获得类的修饰符
            UserInfo ui =new UserInfo();
            System.out.println("获得这个类的修饰符:"+GetModifiers.useModifiers(ui)+"
    ");
            
            //获得本类属性的修饰符
            GetModifiers gm = new GetModifiers();
            gm.checkThisClassModifiers();
            
        }
    
    }

    运行结果:

    获得这个类的修饰符:public

    第1个属性的修饰符为:private

    第2个属性的修饰符为:

    第3个属性的修饰符为:public static final      



     

     

     

     

     

    实例五:获得类的构造函数

    package reflection.getconstructor;
    
    import java.lang.reflect.Constructor;
    
    //获得类的构造函数
    public class GetConstructor {
    
        //构造函数一
        GetConstructor(int a) {
            
        }
        
        //构造函数二
        GetConstructor(int a, String b) {
            
        }
        
        public static void getConstructorInfo(String className) {
            try {
                //获得类的对象
                Class cl =Class.forName(className);
                System.out.println("获得类"+className+"所有的构造函数");
                Constructor ctorlist[] = cl.getDeclaredConstructors();
                System.out.println("遍历构造函数
    ");
                for(int i =0 ; i<ctorlist.length; i++)
                {
                    Constructor con = ctorlist[i];
                    System.out.println("这个构造函数的名字为:"+con.getName());
                    System.out.println("通过构造函数获得这个类的名字为:"+con.getDeclaringClass());
                    
                    Class cp[] = con.getParameterTypes();
                    for (int j=0; j<cp.length; j++)
                    {
                        System.out.println("参数 "+j+" 为 "+cp[j]+"
    ");
                    }
                }
            }catch (Exception e) {
                    System.err.println(e);            
            }
        }
        public static void main(String[] args) {
            GetConstructor.getConstructorInfo("reflection.getconstructor.GetConstructor");
        }
    
    }

    运行结果:

    获得类reflection.getconstructor.GetConstructor所有的构造函数

    遍历构造函数

    这个构造函数的名字为:reflection.getconstructor.GetConstructor

    通过构造函数获得这个类的名字为:class reflection.getconstructor.GetConstructor       

    参数 0 为 int

    这个构造函数的名字为:reflection.getconstructor.GetConstructor

    通过构造函数获得这个类的名字为:class reflection.getconstructor.GetConstructor

    参数 0 为 int

    参数 1 为 class java.lang.String



     

     

     

     

     

     

     

     

     

     

     

    实例六:获得父类

    package reflection.getparentclass;
    
    //获得父类
    public class GetParentClass {
    
        public static String getParentClass(UserInfoMore uim) {
            
            //获得父类
            Class uimc = uim.getClass().getSuperclass();
            System.out.println("获得父类的名字为:"+uimc.getName());
            return uimc.getName();
            
        }
        
        public static void searchParentClass() {
            
        }
        
        public static void main(String[] args) {
            
            UserInfoMore uim = new UserInfoMore();
            System.out.println("成功获得UserInfoMore的父类:"+GetParentClass.getParentClass(uim));
            
        }
    
    }

    运行结果:

    获得父类的名字为:reflection.UserInfo

    成功获得UserInfoMore的父类:reflection.UserInfo   



     

     

    实例七:获得类的方法

    package reflection.getmethod;
    
    import java.lang.reflect.Method;
    
    //获得类的方法
    public class GetMethod {
    
        public static void getMethods(String className) {
            try {
                System.out.println("开始遍历类"+className+".class");
                //获得类名
                Class cls = Class.forName(className);
                //利用方法获得所有该类的方法
                System.out.println("利用类的getDeclaredMethods获得类的所有方法");
                Method ml[] =cls.getDeclaredMethods();
                System.out.println("遍历获得的方法数组
    ");
                for (int i = 0 ;i<ml.length;i++)
                {
                    System.out.println("开始遍历第"+(i+1)+"个方法");
                    Method m = ml[i];
                    System.out.println("开始获取方法的变量类型");
                    Class ptype[] = m.getParameterTypes();
                    for (int j=0; j<ptype.length; j++)
                    {
                        System.out.println("方法参数"+j+"类型为"+ptype[j]);
                    }
                    Class gEx[] = m.getExceptionTypes();
                    for (int j=0 ; j<gEx.length; j++)
                    {
                        System.out.println("异常"+j+"为"+ gEx[j]);
                    }
                    
                    System.out.println("该方法的返回值类型为:"+m.getReturnType()+"
    ");
                    
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) {
            GetMethod.getMethods("reflection.UserInfo");
        }
    
    }

    运行结果:

    开始遍历类reflection.UserInfo.class

    利用类的getDeclaredMethods获得类的所有方法         

    遍历获得的方法数组

    开始遍历第1个方法

    开始获取方法的变量类型

    该方法的返回值类型为:class java.lang.String

    开始遍历第2个方法

    开始获取方法的变量类型

    该方法的返回值类型为:class java.lang.Integer

    开始遍历第3个方法

    开始获取方法的变量类型

    方法参数0类型为class java.lang.String

    该方法的返回值类型为:void

    开始遍历第4个方法

    开始获取方法的变量类型

    该方法的返回值类型为:class java.lang.String

    开始遍历第5个方法

    开始获取方法的变量类型

    方法参数0类型为class java.lang.Integer

    该方法的返回值类型为:void

    开始遍历第6个方法

    开始获取方法的变量类型

    该方法的返回值类型为:class java.lang.String

    开始遍历第7个方法

    开始获取方法的变量类型

    方法参数0类型为class java.lang.String

    该方法的返回值类型为:void


     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    这次实例不少吧,而且这些小例子都比较简单,相信大家都可以轻松秒懂。上面一些例子的代码并不是完整的,有些只有一些关键代码,如果想要完整的代码请戳下面的链接。最后祝大家学习愉快!

     

    源码下载

     

  • 相关阅读:
    Python循环语句
    Python简单的语句组
    Jedis 之 初始<一>
    微信小程序登入流程
    微信小程序发起请求
    django数据库迁移时候异常
    Git常用命令总结
    微信小程序自定义组件
    POJ3345 Bribing FIPA
    POJ1947 Rebuilding Roads
  • 原文地址:https://www.cnblogs.com/liushuijinger/p/3418538.html
Copyright © 2011-2022 走看看