Java反射机制从API到实例结合多方资料总结Word文档格式.docx

上传人:b****1 文档编号:839231 上传时间:2023-04-29 格式:DOCX 页数:13 大小:18.67KB
下载 相关 举报
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第1页
第1页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第2页
第2页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第3页
第3页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第4页
第4页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第5页
第5页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第6页
第6页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第7页
第7页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第8页
第8页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第9页
第9页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第10页
第10页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第11页
第11页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第12页
第12页 / 共13页
Java反射机制从API到实例结合多方资料总结Word文档格式.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Java反射机制从API到实例结合多方资料总结Word文档格式.docx

《Java反射机制从API到实例结合多方资料总结Word文档格式.docx》由会员分享,可在线阅读,更多相关《Java反射机制从API到实例结合多方资料总结Word文档格式.docx(13页珍藏版)》请在冰点文库上搜索。

Java反射机制从API到实例结合多方资料总结Word文档格式.docx

Classc21=Class.forName("

java.lang.String"

Classc22=Class.forName("

ReflectionDemos.MyClass"

Classc23=Class.forName("

OperateFile.CopyFile1"

System.out.println(c21.getSimpleName());

System.out.println(c22.getSimpleName());

System.out.println(c23.getSimpleName());

//3.Classc=String.class;

第三种获取类的方法:

ClassiClass2=int.class;

System.out.println(iClass2.getSimpleName());

//

//4.运用原始包装类中的TYPE方法

//Classc1=Integer.TYPE;

//Classc2=Boolean.TYPE;

//Classc3=Void.TYPE;

//Classc4=Character.TYPE;

第四种获取类的方法:

ClassiClass3=Integer.TYPE;

System.out.println(iClass3.getCanonicalName());

System.out.println(iClass3.getSimpleName());

Output:

Integer

String

MyClass

CopyFile1

int

2.//显示一个对象的类名

/*

*@method1显示对象的类名

*/

publicstaticvoidprintClassName(Objectobj){

Theclassof"

+obj.getClass().getName());

}

/*

*@testmethod1

*/

ClassTestct=newClassTest();

printClassName(ct);

TheclassofReflectionDemos.ClassTest

3.获得类的所有属性:

(包括public\private\protected)

/*

*@method2Class<

?

>

Field[]getDeclaredFields()返回Field

*对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段。

importjava.lang.reflect.Field;

Field[]fields=Class.forName("

.getDeclaredFields();

for(inti=0;

i<

fields.length;

i++){

System.out.println("

属性名:

+fields[i].getName()+"

\t属性类型"

+fields[i].getType());

}

i属性类型int

f属性类型float

s属性类型classjava.lang.String

array属性类型class[Ljava.lang.Object;

4.//获得类的所有方法

Methodmethods[]=classType.getDeclaredMethods();

methods[0].toString();

//此方法的描述

*@method4Class<

Method[]getDeclaredMethods()返回Method

*对象的一个数组,这些对象反映此Class

*对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

Method[]methods=Class.forName("

.getDeclaredMethods();

methods.length;

MyClass类的方法:

+methods[i].getName());

getI

setI

getF

setF

getS

setS

5.Method类的方法:

getModifiers()返回此Method对象所表示方法的Java语言修饰符

getName()以String形式返回此Method对象表示的方法名称

Annotation[][]getParameterAnnotations()

返回表示按照声明顺序对此Method对象所表示方法的形参进行注释的那个数组的数组。

在WebService中也有一种运用Java标注的情况。

Class<

[]getParameterTypes():

按照声明顺序返回Class对象的数组,这些对象描述了此Method对象所表示的方法的形参类型。

Etc:

*@method6Class<

按照声明顺序返回Class对象的数组,这些对象描述了此

*Method对象所表示的方法的形参类型。

下面测试获取方法形参类型:

方法名为:

+method.getName());

//privatestaticvoidsetI(inti,Stringstr)

Class<

[]paramClass=method.getParameterTypes();

paramClass.length;

System.out.println(paramClass[i].getSimpleName());

getReturnType()

返回一个Class对象,该对象描述了此Method对象所表示的方法的正式返回类型。

*@method7Class<

getReturnType()返回一个Class对象,该对象描述了此Method

*对象所表示的方法的正式返回类型。

下面测试方法的返回类型:

returnType=method.getReturnType();

System.out.println(returnType.getSimpleName());

void

 

Objectinvoke(Objectobj,Object...args)

对带有指定参数的指定对象调用由此Method对象表示的底层方法。

6.方法调用(invoke)及获取指定名称和参数的方法:

A.针对只具有默认构造函数的类:

*运用反射机制调一个类的方法

*/

publicclassInvokeTester{

inti;

Strings;

//publicInvokeTester(inti,Strings){

//this.i=i;

//this.s=s;

//}

publicintadd(intparam1,intparam2){

returnparam1+param2;

publicStringecho(Stringmsg){

return"

echo:

+msg;

publicstaticvoidmain(String[]args)throwsException{

classType=InvokeTester.class;

//获得该类的一个默认对象(实例),与方法ObjectobjectCopy=classType.getConstructor(new

//Class[]{}).newInstance(newObject[]{});

//等效

ObjectinvokeTester=classType.newInstance();

//注意是默认对象,即InvokeTester类只有默认构造函数

//ObjectinvokeTester=classType.getConstructor(newClass[]{int.class,String.class});

//调用InvokeTester对象的add()方法

MethodaddMethod=classType.getMethod("

add"

newClass[]{int.class,

int.class});

//如果第二个参数为newClass[]{}则表示方法无参数

Objectresult=addMethod.invoke(invokeTester,newObject[]{

newInteger(100),newInteger(200)});

System.out.println((Integer)result);

//调用InvokeTester对象的echo()方法

MethodechoMethod=classType.getMethod("

echo"

newClass[]{String.class});

result=echoMethod.invoke(invokeTester,newObject[]{"

Hello"

});

System.out.println((String)result);

}

300

Hello

B.针对具有带参数构造函数的类:

Java允许一个类拥有多个构造方法,并且可以在构造对象时传入参数用来初始化对象。

比如Employee对象的构造方法需要一个String的参数,用来告诉其id。

public 

class 

Employee{

private 

Stringid;

Employee(Stringid){

this.id=id;

在利用反射创建Employee对象时,我们必需为其创建Constructor对象,用来反映此 

Class 

对象所表示的类或接口的指定构造方法。

//生成class

Classcls=Class.forName(className);

//参数类型

Class[]types= 

new 

Class[]{String.class 

};

//类数值对象

Object[]values= 

Object[]{ 

001"

//找到指定的构造方法

Constructorconstructor=cls.getDeclaredConstructor(types);

//设置安全检查,访问私有构造函数

constructor.setAccessible(true);

//创建对象

Employeee=(Employee)constructor.newInstance(values);

自己的例子:

importjava.lang.reflect.Constructor;

importjava.lang.reflect.Method;

publicInvokeTester(inti,Strings){

this.i=i;

this.s=s;

//ObjectinvokeTester=classType.newInstance();

//构造函数参数类型

Class[]types=newClass[]{int.class,String.class};

//构造函数参数值

Object[]values=newObject[]{12,"

//找到指定的构造方法

Constructorconstructor=classType.getDeclaredConstructor(types);

//设置安全检查,访问私有构造函数

constructor.setAccessible(true);

//创建对象

InvokeTesterinvokeTester=(InvokeTester)constructor.newInstance(values);

7.在生成对象后直接访问属性:

import 

java.lang.reflect.Field;

TestField{

Stringtest;

static 

void 

main(String[]args){

try 

{

Classcls=Class.forName("

TestField"

Fieldf=cls.getField("

test"

TestFieldtf= 

(TestField)cls.newInstance();

f.set(tf, 

System.out.println(tf.test);

catch 

(Exceptionex){

System.out.println(ex);

8.获取Field值:

a.创建一个Class对象

b.通过getField创建一个Field对象

c.调用Field.getXXX(Object)方法(XXX是Int,Float等,如果是对象就省略;

Object是指实例).

b.Etc.

importjava.lang.reflect.*;

importjava.awt.*;

classSampleGet{

publicstaticvoidmain(String[]args){

Rectangler=newRectangle(100,325);

printHeight(r);

staticvoidprintHeight(Rectangler){

FieldheightField;

IntegerheightValue;

Classc=r.getClass();

try{

heightField=c.getField("

height"

heightValue=(Integer)heightField.get(r);

Height:

+heightValue.toString());

}catch(NoSuchFieldExceptione){

System.out.println(e);

}catch(SecurityExceptione){

}catch(IllegalAccessExceptione){

AdditionalResource:

Tcast(Objectobj)

将一个对象强制转换成此Class对象所表示的类或接口。

Class<

[]getClasses()

返回一个包含某些Class对象的数组,这些对象表示属于此Class对象所表示的类的成员的所有公共类和接口。

booleanisPrimitive()

判定指定的Class对象是否表示一个基本类型。

*@method5Class<

booleanisPrimitive()判定指定的Class对象是否表示一个基本类型。

System.out.println(Integer.class.isPrimitive());

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2