传智播客java15元购买-java基础班_第1页
传智播客java15元购买-java基础班_第2页
传智播客java15元购买-java基础班_第3页
传智播客java15元购买-java基础班_第4页
传智播客java15元购买-java基础班_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

反射p

=newStudent();若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法:若编译和运行类型都知道,使用instanceof判断后,强转。编译时根本无法预知该对象的类属于哪些类,程序只能依靠运行时信息来发现对象和类的真实信息,这是反射就必须使用了。要是想通过对象来找其对应的类名,就得使用反射。传智播客教育Class类和Class类实例Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?人Java类

Class对比提问:类代表人,它的实例对象就是,这样一个个具体的人,Class类代表Java类,它的各个实例对象又分别对应什么呢?对应各个类在内存中的字节码,例如,

类的字节码,ArrayList类的字节码,等等;一个类被类加载器加载到内存中,占用一片空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的;一个类在虚拟机中通常只有一份字节码;传智播客教育获得Class对象如何得到各个字节码对应的实例对象?每个类被加载后,系统会为该类生成对应的Class对象,通过Class对象可以

到JVM中的这个类,3种方式:使用Class类的forName(String

n)静态方法,n表示类全名;包名.子包名....类名调用某个类的class属性获取Class对象,如Date.class会返回Date类对应的Class对象(其实就是得到一个类的一份字节码文件);调用某个对象的getClass()方法。该方法属于Object类;Class<Date>

clz

=

new

Date().getClass();传智播客教育九个预定义Class对象基本的Java类型(boolean、byte、char、short、int、long、float和double)和关键字void

也表示为Class

对象;Class类中boolean

isPrimitive():判定指定的Class

对象是否表示一个基本类型。包装类和Void类的静态TYPE属性;Integer.TYPE

==

int.class

;Integer.class

==

int.class;//

true//false数组类型的Class实例对象:Class<String[]>

clz

=

String[].class;Class类中boolean

isArray():判定此Class

对象是否表示一个数组类。传智播客教育从Class中获取信息-构造方法ConstructorConstructor表示类中的构造方法:Constructor<T>

getConstructor(Class<?>...

parameterTypes)返回该Class对象表示类的指定的public构造方法。Constructor<?>[]

getConstructors()返回该Class对象表示类的所有public构造方法。Constructor<T>getDeclaredConstructor(Class<?>...parameterTypes)返回该Class对象表示类的指定的构造方法。和 权限无关Constructor<?>[]

getDeclaredConstructors()返回该Class对象表示类的所有构造方法。和权限无关。传智播客教育从Class中获取信息-方法MethodMethod表示类中的方法:Method

getMethod(String

name,

Class<?>...

parameterTypes)返回该Class对象表示类和其父类的指定的public方法。Method[]

getMethods():返回该Class对象表示类和其父类的所有public方法。MethodgetDeclaredMethod(Stringname,Class<?>...parameterTypes)

:返回该Class对象表示类的指定的方法。和

权限无关,只能是自己类的Method[]

getDeclaredMethods():

获得类所有的方法,包括公共、保护、默认(包) 和私有方法,但不包括继承的方法。传智播客教育从Class中获取信息-字段FieldField表示类中的成员变量:Field

getField(String

name)返回该Class对象表示类和其父类的指定的public属性。Field[]

getFields()返回该Class对象表示类和其父类的所有public属性。Field

getDeclaredField(String

name)返回该Class对象表示类的指定的字段。和

权限无关。Field[]

getDeclaredFields()包括公共、保护、默认(包)

和私有字段,但不包括继承的字段传智播客教育从Class中获取信息-注解Annotation<A

extends

Annotation>

A

getAnnotation(Class<A>annotationClass)如果存在该元素的指定类型的注释,则返回这些注释,否则返回null。Annotation[]

getAnnotations()返回此元素上存在的所有注释。Annotation[]

getDeclaredAnnotations()返回直接存在于此元素上的所有注释。传智播客教育从Class中获取信息-判断类型boolean

isAnnotation():boolean

isArray():booleanisEnum():boolean

isInterface():boolean

isInstance(Object

obj):如果obj是此类的实例,则返回true。等价于instanceof传智播客教育从Class中获取信息怎么区分一个方法和其他方法的不同---->方法签名getMethod和getConstructor都需要传入个数可变的参数:public

void

info()public

void

info(String

s)public

void

info(String

s,Integer

i)调用指定的方法:clz.getMethod("info",String.class,Integer.class);思考:为什么构造方法不需要传入方法名字传智播客教育使用反射生成操作对象-创建对象创建对象:使用Class对象的newInstance()方法创建该Class对象的实例,此时该Class对象必须要有无参数的构造方法。使用Class对象获取指定的Constructor对象,再调用Constructor的newInstance()方法创建对象类的实例,此时可以选择使用某个构造方法。传智播客教育例子使用指定构造方法来创建对象。获取该类的Class对象。利用Class对象的getConstructor()方法来获取指定的构造方法。调用Constructor的newInstance()方法创建对象。。。。。main

。。。。{Class<JFrame>

jfClz

=(Class<JFrame>)Class.forName("javax.swing.JFrame");Constructor<JFrame>cj=

jfClz.getConstructor(String.class);JFrame jf=cj.newInstance("我是窗口");jf.setVisible(true);}传智播客教育忽略权限若要 对象private的成员?在调用之前使用setAccessible(boolean

flag):当flag为true的时候,就会忽略权限。x=getDeclared

x()//才能得到私有的类属性

x.setAccessible(true);再来调用

, x

=getDeclared

x()传智播客教育使用反射操作对象-调用方法每个Method对象对应一个方法。获得Method对象后,程序可以使用Method里面的invoke方法。Object

invoke(Object

obj,Object...args):obj表示调用底层方法的对象,后面的args表示调用de

shiji参数。如果底层方法是静态的,那么可以忽略指定的

obj参数。该参数可以为

null。如果底层方法所需的形参个数为

0,则所提供的

args数组长度可以为

0或null。不写,null,或new

Object[]{}怎么调用某个类的主方法?传智播客教育调用主方法class

Demo{public

static

void

main(String[]

args){

System.out.println("我被调用了");}}public

class

ReflectDemo

{public

static

void

main(String[]

args)

throws

Exception

{Class<Demo>

clz =

Demo.class;Method

m

=

clz.getMethod("main",String[].class);m.invoke(null,

new

Object[]{new

String[]{"A","B"}});m.invoke(null,

(Object)new

String[]{"A","B"});//m.invoke(null,

"A","B");//wrong

number

of

arguments}}传智播客教育使用反射操作对象-

属性Field提供两组方法 属性:

get

(Object

obj):获取obj对象该Field的属性值,此处的 表示8个基本数据类型。若该属性的类型是数据类型则使用,Object

get(Object obj)。void

set

(Object

obj,

val):将obj对象的该Field字段设置成val值,此处的 表示8个基本数据类型。若数据类型则使用,void

set(Object该属性的类型是obj,

Object

value)传智播客教育传智播客教育反射和泛型String.class的类型是Class<String>,若Class对应的类未知,则使用Class<?>,通过反射中使用泛型,可避免使用反射生成的对象需要强制转换。class

Factory{public

static

Object

getInstance(String

classname){return

Class.forName(classname).newInstance();}}.......................?=

Factory.getInstance("java.util.Date");?=

Factory.getInstance("java.lang.String");反射和泛型-泛型和Class类class

Factory{public

static

<T>

T

getInstance(Class<T>

clz){return

clz.newInstance();}}?

=

Factory.getInstance(java.util.Date.class);?

=

Factory.getInstance(java.lang.String.class);传智播客教育反射和泛型-反射来获取泛型信息通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private方法public。获得Field对象后都可以使用getType()来获取其类型。Class<?>type=f.getType();//获得字段的类型但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>;为了获得指定Field的泛型类型, 采用:TypegType=f.getGenericType();得到泛型类型然后将Type对象强转为ParameterizedType,其表示增加泛型后的类型TypegetRawType()//返回被泛型限制的类型Type[] getActualTypeArguments()//返回泛型参数类型传智播客教育例子<String

,

Integer>

score;..{GenericTest>

clazz

=

GenericTest.class;f

=

clazz.getDeclaredField("score");用getType()取出Field类型只对普通类型的Field有效?>

a

=f.getType();.out.println("score的类型是:"+a);ield实例f的泛型类型Type

=

f.getGenericType();Type类型是ParameterizedType对象pe

instanceof

ParameterizedType){//强制类型转换ParameterizedType

pType=(ParameterizedType)gType;Type

rType=pType.getRawType();//获取原来类型System.out.println("原始类型是:"+rType);tArgs=pType.getActualTypeArguments();//取得泛型类型的泛型参数System.out.println("泛型类型是:");for

(int

i

=

0;

i

<

tArgs.length;

i++)

{.out.println("第"+i+"个泛型类型是:"+tArgs[i]);}ParameterizedType在泛型Dao中Dao:public

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论