java 反射机制 2018-05-18

反射就是把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);

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342