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 "";

}


 

原文地址:https://www.cnblogs.com/yujian-bcq/p/3549168.html