zoukankan      html  css  js  c++  java
  • 注解和反射

    注解声明

      

    Java反射机制

      

     反射的作用

      

     常用API

      

    public class GetClassInfo {
        public void test(String className) throws Exception{
            //获取Person类对象
            Class cls = Class.forName(className);
            
            //获取类在的包名
            Package pkg = cls.getPackage();
            System.out.println(cls.getSimpleName() + "定义在:" + pkg.getName() + "包中");
            System.out.println("--------------------------");
            
            //获取此对象所表示的实体(类、接口、基本类型或void)的超类Class
            //如果此对象是Object类、一个接口、一个基本类型或void,他的超类返回Null
            //如果此对象是一个数组类,返回表示Object类的Class对象
            Class superClass = cls.getSuperclass();
            System.out.println(cls.getSimpleName() + "的超类是:" + superClass.getName());
            System.out.println("--------------------------");
            
            //获取Person类所实现的接口
            //如果Person类没有实现任何的接口,返回一个长度为0的数组
            //如果Person类是一个基本类型或者是void,那么也返回一个长度为0的数组
            Class[] interfaces = cls.getInterfaces();
            System.out.println("所实现的数组有:");
            for(Class c : interfaces){
                System.out.println(c.getName());
            }
            System.out.println("---------------------------");
        }
        
        public static void main(String[] args) throws Exception{
            GetClassInfo getci = new GetClassInfo();
            getci.test("entity.Person");
        }
    }
    获取类的信息
    public class GetClassConstructorInfo{
        public void test1() throws Exception{
            Class cls = Class.forName("entity.Person");
            Object obj = cls.newInstance();
            System.out.println(obj.toString());
        }
        
        public void test2() throws Exception{
            Class cls = Class.forName("entity.Person");
            //获取类的构造函数
             Constructor[] consts = cls.getDeclaredConstructors(); 
             System.out.println("=============构造函数展示============");
             for(Constructor con : consts){
                 Class[] params = con.getParameterTypes();
                 if(params.length == 0){
                     System.out.println("此构造函数没有参数");
                 }else{
                     System.out.println("此构造函数的参数列表为:");
                     for(int i=0; i<params.length; i++){
                         if(i!=0){
                             System.out.println(",");
                         }
                     }
                 }
             }
        }
        
        public static void main(String[] args) throws Exception {
            GetClassConstructorInfo cons = new GetClassConstructorInfo();
            cons.test1();
        }
    }
    获取类的构造函数信息
    public class GetClassMethodsInfo {
    
        public static void main(String[] args) {
            GetClassMethodsInfo med = new GetClassMethodsInfo();
            // 展示方法调用
    //        med.invokeSetter("entity.Person", "name", "java.lang.String", "张三");
            // 展示Person类中的方法信息
             med.showMethod();
        }
        
        public void invokeSetter(String clsName, String propName, String propType,
                Object propValue) {
    
            try {
                // 通过反射创建一个实例
                Class cls = Class.forName(clsName);
                Object obj = cls.newInstance();
    
                String firstLetter = propName.substring(0, 1).toUpperCase();
                String methodName = "set" + firstLetter + propName.substring(1);
                // 根据方法名和参数列表获取setter方法
                Method method = cls.getDeclaredMethod(methodName, Class.forName(propType));
                // 如果需要,可以通过setAccessable方法,设定为可以访问
                // method.setAccessible(true);
                // 调用方法并传参
                method.invoke(obj, propValue);
    
                System.out.println(obj);
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
        public void showMethod() {
    
            Method[] methods;
            try {
                // 获取Person中的所有方法,
                // 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法,
                // 如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0
                // 的数组。
                methods = Class.forName("entity.Person")
                        .getDeclaredMethods();
    
                // 展示方法的一些信息
                System.out.println("===========方法展示==========");
                for (Method method : methods) {
                    System.out.println("方法名:" + method.getName());
                    System.out.println("返回值类型:" + method.getReturnType().getName());
    
                    // 获取方法的参数列表
                    Class[] params = method.getParameterTypes();
                    if (params.length == 0) {
                        System.out.println("该方法没有参数");
                    } else {
                        System.out.print("该方法的参数列表为:[");
                        for (int i = 0; i < params.length; i++) {
                            if (i != 0)
                                System.out.print(", ");
                            System.out.print(params[i].getName());
                        }
                        System.out.println("]");
                    }
    
                    // 获取方法所属的类或接口的Class对象
                    Class declaringClass = method.getDeclaringClass();
                    System.out.println("方法声明在:" + declaringClass.getName() + " 中");
    
                    // 获取方法抛出的异常类型,即throws子句中声明的异常
                    Class[] exceptions = method.getExceptionTypes();
                    if (exceptions.length > 0) {
                        System.out.print("该方法抛出的异常有:[");
                        for (int i = 0; i < exceptions.length; i++) {
                            if (i != 0)
                                System.out.print(", ");
                            System.out.print(exceptions[i].getName());
                        }
                        System.out.println("]");
                    }
    
                    System.out.println("----------------------------");
                }
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
    }
    获取类的方法信息
    public class GetClassFieldsInfo {
    
        public static void main(String[] args) {
            GetClassFieldsInfo fieldTest = new GetClassFieldsInfo();
            // 查看字段信息
            fieldTest.showFields();
            // 直接访问字段
            fieldTest.accessField();
        }
        
        public void showFields() {
    
            Field[] fields;
            try {
                // 获取Person中的所有字段,
                // 包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段,
                // 如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。
                fields = Class.forName("entity.Person").getDeclaredFields();
    
                // 展示字段的一些信息
                System.out.println("===========字段展示==========");
                for (Field field : fields) {
                    System.out.println("字段名:" + field.getName());
                    System.out.println("类型:" + field.getType().getName());
                    System.out.println("----------------------------");
                }
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
        
        public void accessField() {
    
            // 本例演示通过反射操作Person的字段
            try {
                // 通过反射加载一个Person实例
                Class cls = Class.forName("entity.Person");
                Object obj = cls.newInstance();
    
                // 获取name字段
                Field name = cls.getDeclaredField("name");
                // name字段为private,这里已超出其访问范围,不能直接访问
                // 通过setAccessable方法,设定为可以访问
                name.setAccessible(true);
                // 先取值看一下
                System.out.println("赋值前的name:" + name.get(obj));
                // 为name字段赋值
                name.set(obj, "New Person");
                // 展示一下赋值效果
                System.out.println("赋值后的name:" + name.get(obj));
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    }
    获取类的属性信息

      

  • 相关阅读:
    未处理的异常 stack overflow
    Largest Rectangle in a Histogram [POJ2559] [单调栈]
    Blocks [POJ3734] [矩阵快速幂]
    Rectangular Covering [POJ2836] [状压DP]
    Arrange the Bulls [POJ2441] [状压DP]
    The Water Bowls [POJ3185] [开关问题]
    Bound Found [POJ2566] [尺取法]
    4 Values whose Sum is 0 [POJ2785] [折半搜索]
    Physics Experiment 弹性碰撞 [POJ3684]
    Fliptile [POJ3279] [开关问题]
  • 原文地址:https://www.cnblogs.com/xhddbky/p/9328084.html
Copyright © 2011-2022 走看看