Java反射机制从API到实例结合多方资料总结Word文档格式.docx
《Java反射机制从API到实例结合多方资料总结Word文档格式.docx》由会员分享,可在线阅读,更多相关《Java反射机制从API到实例结合多方资料总结Word文档格式.docx(13页珍藏版)》请在冰点文库上搜索。
![Java反射机制从API到实例结合多方资料总结Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/31ca015d-dace-4452-9a6d-40c1ea163dad/31ca015d-dace-4452-9a6d-40c1ea163dad1.gif)
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());