美文网首页
java 反射机制 2018-05-18

java 反射机制 2018-05-18

作者: 码记 | 来源:发表于2018-05-18 08:50 被阅读0次

    反射就是把java中的各种成分映射成一个个的java对象

    1. Class对象:class类的实例表示正在运行的java应用程序中的类和接口。所有具有相同元素类型和维数的数组都共享改Class对象

    获取Class对象有三种方式

    (1)通过实例变量的getClass()方法

    Class cl=new String(“abc”).getClass();

    (2)通过Class类的静态方法--forName()来实现

    Class class=Class.forName(className);

    (3)使用类字面常量或TYPE字段

    ① Class MyObjectClass=MyObject.class;

    ② Class c=Integer.TYPE;

    2.类,通过反射可以从中获取 类名、类修饰符、包信息、父类、实现的接口、构造函数、方法、字段、注解

    (1)类名

    ①可以使用getName()或getCanonicalName()获取包含包名的类名

    Class stuClass=MyObject.class;

    //String stuName=stuClass.getName();

    String stuName=stuClass.getCanonical();

    ②可以使用getSimpleName()获取不包含包名的类名

    Class stuClass=MyObject.class;

    String simpleClassName=stuClass.getSimpleName();

    (2)修饰符 可以使用getModifiers()来获取一个类的修饰符

    Class modiClass=MyObject.class;

    Int modifiers=modiClass.getModifiers();

    //检验修饰符

    Modifier.isAbstract/isFinal(int modifiers);

    Modifier.isInterface/isProtected/isPublic(int modifiers);

    Modifier.isStatic/isSynchronized(int modifiers);

    (3)包信息 使用Class对象获取包信息

    Class pClass=MyObject.clss;

    Package package=pClass.getPack();

    String packageName=package.getName();

    (4)父类 通过Class对象可以获取类的父类

    Class objClass=MyObject.class;

    Class superclass=objClass.getSuperclass();

    (5) 实现接口

    Class interClass=MyObject.class;

    Class[] interfaces=interClass.getInterfaces();//一个类可以实现多个接口

    (6) 构造函数

    Class consClass=MyObject.class;

    Constructor[] constructors=consClass.getConstructors();

    (7) 方法

    Class aClass=MyObject.class;

    Method[] method=aClass.getMethods();

    (8)字段可以通过Class对象获取类的字段(成员变量)

    Class aClass=MyObject.class;

    Field[] fields=aClass.getFields();

    (9) 注解

    Class aClass=MyObject.class;

    Annotation[] annotations=aClass.getAnnotations();

    3.构造函数 通过java反射可以在运行时检查类的构造函数并实例化对象

    (1)获取Constructor对象 通过从Class对象获取的

    Class aClass=MyObject.class;

    Constructor[] constructors=aClass.getConstructors();

    (2) 构造函数参数

    Class aClass=MyObject.class;//MyObject有一个参数为字符串的公共构造函数

    Constructor constructor=aClass.getConstructor(new Class[]{String.class});

    Class[] parameterTypes=constructor.getParameterType();

    (3)使用Constructor对象实例化对象

    //获取使用字符串作为参数的constructor

    Constructor constructor=MyObject.class.getConstructor(String.class);

    MyObject myObject=(MyObject)constructor.newInstance(“constr”);

    4.字段 通过java反射可以在运行时检查类的字段并提供get/set,通过java.lang.reflect.Field来完成

    (1)可以获取Field对象

    Class aClass=MyObject.class;

    Field[] methods=aClass.getFields();

    (2)字段名称 通过Field.getName()方法来获取字段名称

    Field field=new Field();//获取field对象

    String fieldName=field.getName();

    (3) 字段类型

    Field field=aClass.getField(“someField”);

    Object fieldType=field.getType();

    (4) 获取和设置字段值

    Class aClass=MyObject.class;

    Field field=aClass.getField(“someField”);

    MyObject objectInstance=new MyObject();

    Object value=field.get(objectInstance);

    Field.set(objectInstance,value);  

    5.方法 使用java反射在运行时检查类的方法并调用他们

    (1)获取Method对象

    Class class1=MyObject.class;

    Method methods=class1.getMethods();

    (2) 方法的参数和返回值类型

    Method method=class1.getMethods();

    Class returnType=method.getReturnType();

    (3)使用Method对象调用方法

    Method method=MyObject.class.getMethod(“doSomething”,String.class);

    Object returnValue=method.invoke(null,”parameterValue”);

    6. Get和set方法

    7. 私有字段和方法

    (1)访问私有字段通过class.getDeclaredField(Stringname)或class.getDeclaredFields()

    (2)访问私有方法 通过class.getDeclaredMethod(String name,Class[] parameterTypes)或class.getDeclaredMethod()

    8. Array

    (1) Java.lang.reflect.Array 通过java反射使用数组完成

    (2) 创建数组

    Int[] array=(int[])Array.newInstance(int.class,3);

    (3)访问数组 通过Array.get()和Array.set()

    Int[] array=(int[])Array.newInstance(int.class,3);

    Array.set(array,0,123);

    Array.set(array,1,456);

    System.out.println(“array[0]=”+Array.get(array,0));

    System.out.println(“array[1]=”+Array.get(array,1));

    (4)获取数组的class对象

    (5)获取数组的组件类型 通过class.getComponentType()来获取其它组件类型

    String[] stings=new String[3];

    Class stringArrayClass=strings.getClass();

    Class stringArrayComponentType=stringArrayClass.getComponentType();

    System.out.println(stringArrayComponentType);

    9.注解 使用java反射机制可以在运行时访问java类中的注解

    (1) 类注解

    Class aClass=TheClass.class;

    Annotation[] annotations=aClass.getAnnotations();

    For(Annotation annotation:annotations){

    If(annotation instanceof MyAnnotation){

    MyAnnotation myAnnotation=(MyAnnotation) annotation;

    System.out.println(“name:”+myAnnotation.name());

    System.out.println(“value:”+myAnnotation.value());

    }

    }

    (2) 方法注解

    Public class TheClass{

    @MyAnnotation(name=”someName”,value=”HelloWorld”)

    Public void doSomething(){}

    }

    (3) 参数注解

    Public class TheClass{

    Public static void doSomethingElse(

    @MyAnnotation(name=“aName”,value=”aValue”) String parameter

    ){}

    }

    (4) 字段注解

    Public class TheClass{

    @MyAnnotation(name=”someName”,value=”Hello World”)

    Public String myField=null;

    }

    10. 泛型

    (1) 泛型方法的返回值类型

    Protected List stringList=new ArrayList();

    Public List getStringList(){

    Return this.stringList;

    }

    (2) 泛型方法的参数类型

    Protected List stringList=new ArrayList();

    Public void setStringList(List list){

    This.stringList=list;

    }

    (3) 泛型字段类型

    Public class MyClass{

    Public List stringList=new ArrayList();

    }

    Field field=MyClass.class.getField(“stringList”);

    Type genericFieldType=field.getGenericType();

    If(genericFieldType instanceof ParameterizedType){

    ParameterizedType aType=(ParameterizedType) genericFieldType;

    Type[] fieldArgTypes=aType.getActualTypeArguments();

    For(Type fieldArgType: fieldArgTypes){

    Class fieldArgClass=(Class)fieldArgType;

    System.out.println(“fieldArgClass=”+fieldArgClass);

    }

    }

    相关文章

      网友评论

          本文标题:java 反射机制 2018-05-18

          本文链接:https://www.haomeiwen.com/subject/byqsdftx.html