美文网首页
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反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • 详解Java反射机制(Reflection)

    详解Java反射机制(Reflection) 反射机制的作用 JAVA反射机制是在运行状态中,对于任意一个类,都能...

  • java 反射机制 2018-05-18

    反射就是把java中的各种成分映射成一个个的java对象 1.Class对象:class类的实例表示正在运行的ja...

网友评论

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

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