• java 反射


    所有类的对象其实都是Class的实例

    获取是类对象的方式:

    package Reflect;
    class Demo{
        //other codes...
    }
     
    class hello{
        public static void main(String[] args) {
            Class<?> demo1=null;
            Class<?> demo2=null;
            Class<?> demo3=null;
            try{
                //一般尽量采用这种形式
                demo1=Class.forName("Reflect.Demo");
                //Class<?> cls = Class.forName(obj.getClass().getName);
    
            }catch(Exception e){
                e.printStackTrace();
            }
            demo2=new Demo().getClass();
            demo3=Demo.class;
             
            System.out.println("类名称   "+demo1.getName());
            System.out.println("类名称   "+demo2.getName());
            System.out.println("类名称   "+demo3.getName());
             
        }
    }
    View Code
    通过获取类的对象来整出所有关于这个类的信息的一个东西
    
     //取得全部的构造函数
    
     Constructor<?> cons[]=demo.getConstructors();
    
     
    
    //实例化对象的构造函数
    
     per1=(Person)cons[0].newInstance();
    
     
    
    //取得父类
    Class<?> temp=demo.getSuperclass();
    
     
    
    // 取得本类的全部属性
            Field[] field = demo.getDeclaredFields();
    
            for (int i = 0; i < field.length; i++) {
    
                // 权限修饰符
    
                int mo = field[i].getModifiers();
    
                String priv = Modifier.toString(mo);
    
                // 属性类型
    
                Class<?> type = field[i].getType();
    
                System.out.println(priv + " " + type.getName() + " "
    
                        + field[i].getName() + ";");
    
            }
    
            System.out.println("===============实现的接口或者父类的属性========================");
    
            // 取得实现的接口或者父类的属性
    
            Field[] filed1 = demo.getFields();
    
            for (int j = 0; j < filed1.length; j++) {
    
                // 权限修饰符
    
                int mo = filed1[j].getModifiers();
    
                String priv = Modifier.toString(mo);
    
                // 属性类型
    
                Class<?> type = filed1[j].getType();
    
                System.out.println(priv + " " + type.getName() + " "
    
                        + filed1[j].getName() + ";");
    
            }
    
     
    View Code

    Field

    反照获取对象成员的字段值,getFields()和getDeclaredFields()用法区别

    getFields()只能获取public的字段,包括父类的。
    getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
    (api:http://www.apihome.cn/api/java/Field.html)
     
    Field 基本上和注解(Annotation)结合用的多些
     

    setAccessible(boolean bool)
     值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。可以访问私有域
     值为 false 则指示反射的对象应该实施 Java 语言访问检查。 即不能访问私有域 
     
     
    Annotation:

    元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种,四中对应的参数值分别为:

    @Target 表示该注解目标,可能的 ElemenetType 参数包括:

    ElemenetType.CONSTRUCTOR 构造器声明
    ElemenetType.FIELD 域声明(包括 enum 实例) 
    ElemenetType.LOCAL_VARIABLE 局部变量声明 
    ElemenetType.METHOD 方法声明 
    ElemenetType.PACKAGE 包声明 
    ElemenetType.PARAMETER 参数声明 
    ElemenetType.TYPE 类,接口(包括注解类型)或enum声明

    2. @Retention 表示该注解的生命周期,可选的 RetentionPolicy 参数包括

    RetentionPolicy.SOURCE 注解将被编译器丢弃 
    RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃 
    RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息

    3. @Documented 指示将此注解包含在 javadoc 中

    4.  @Inherited 指示允许子类继承父类中的注解

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface AIDeleteKey
    {
        /**
         * 表示插入数据时是否同时也插入主键到表。默认为false,即表的主键应该为自动生�?     * @return
         */
        String value() default "";
    
    }


     

  • 相关阅读:
    codeforces 540 C Ice Cave【BFS】
    UVa 140 Bandwidth【枚举排列】
    UVa 1600 Patrol Robot【BFS】
    UVa 1599 Ideal Path【BFS】
    HDU 4324 Triangle LOVE【拓扑排序】
    HDU 2647 Reward【拓扑排序】
    UVa 10305 Ordering Tasks【拓扑排序】
    codeforces 501 B Misha and Changing Handles 【map】
    codeforces 510 C Fox And Names【拓扑排序】
    落谷_2740/poj_1273/USACO_4.2/网络流
  • 原文地址:https://www.cnblogs.com/yujian-bcq/p/3549168.html
Copyright © 2020-2023  润新知