欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 科技论文 > 计算机论文

Java反射技术浅谈

时间:2011-04-23  作者:秩名
Methodmethods[] = clazz.getDeclaredMethods();

for(Method meth : methods)

System.out.println(meth.getName()+meth.getReturnType());

//3、2从Class中取出对应类的某个方法,并输出其信息

Methodmethod = clazz.getMethod('hashCode', new Class[] {});

System.out.println(method.getName()+ method.getReturnType());

//4、1 从Class中取出对应类的全部构造方法,并输出其信息

Constructorconstructors[] = clazz.getDeclaredConstructors();

for(Constructor cons : constructors) {

System.out.print(cons.getModifiers()+ cons.getName());

for(Type type : cons.getParameterTypes())

System.out.println(type+ ' ');

}

//4、2 从Class中取出对应类的某个构造方法,并输出其信息

Constructorcons = clazz.getDeclaredConstructor(new Class[]

{char[].class, int.class, int.class });

System.out.print(cons.getModifiers()+ cons.getName());

for(Type type : cons.getParameterTypes())

System.out.print(type+ ' ');

//5、 从Class中取出对应类所在包、类的完整名、简名、父类等信息

System.out.println(clazz.getPackage().getName());

System.out.println(clazz.getName());

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

System.out.println(clazz.getSuperclass());

}

3. 取得Class实例的方法

Class Object的诞生管道 实例
运用getClass() 注:每个类都从Object类继承这个方法 String str= 'abc'; Class c1=str.getClass();
运用.class语法 Class c2=String.class; Class c3=java.awt.Button.class Class c4=int.class
运用static method Class.forName() (最常被使用) Class c5=Class.forName('java.lang.String'); (参数必须是完整类名,包括包名)
运用基本数据类型的包装类的TYPE语法 Class c6=Integer.TYPE; Class c7=Double.TYPE;

三、反射的具体使用Class对象可以获得该类里的成分包括构造器(由Constructor对象表示)、方法(由Method对象表示)、属性(由Field对象表示),这三个类都定义在java.lang.reflect包下,程序可以通过Constructor对象来调用对应的构造器创建对象实例,可以通过Method对象来执行对应的方法,通过Field对象直接访问或修改对象的属性值。

1. 运行时生成类的实例通过反射生成对象有如下两种方式:

(1)通过Class的newInstance()方法使用Class对象的newInstance()方法来创建该Class对象对应类的实例,这种方法要求该Class对象的对应类有无参构造方法,而执行newInstance()实际上就是执行无参构造方法来创建该类的实例。

//相当于语句:Student stu=new Student();

Objectobj=Class.forName('cn.bsw.reflection.Student').newInstance();

此种方法比较常用,因为在很多JavaEE框架中都需要根据配置文件信息来创建Java对象,从配置文件读取的只是某个类的字符串类名,程序就需要根据该字符串来创建对应的实例,此时必须使用反射。

(2)通过Constructor的newInstance()方法先使用Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方法可以选择使用某个类的指定构造方法来创建实例。

//针对有参构造方法,相当于:Student stu=new Student('lkl',32,56.5f);

Classclazz=Class.forName('cn.bsw.reflection.Student');

Constructorcons=clazz.getConstructor(new Class[]

{String.class,int.class,float.class});

Objectobj=cons.newInstance(new Object[]{'lkl',32,56.5f});

//针对无参构造方法,相当于语句:Student stu=new Student();

obj=clazz.getConstructor(newClass[]{}).newInstance(new Object[]{});

obj=clazz.getConstructor().newInstance();

System.out.println(obj);

从以上代码中可以看出,采用第二种方法创建类的实例需要如下三个步骤:

1)获取该类的Class对象。

2)利用Class对象的getConstructor()方法获取指定的构造器(准备一个Class[]作为该方法的参数类型)。

3)调用Constructor的newInstance()方法来创建相应类的对象(准备一个Object[] 作为该方法的实参值)。

2. 运行时变更与调用field值通过Class对象的getFields()或者getField()方法可以获得该类所包括的全部Field属性或指定Field属性。Field提供了以下两组方法来访问属性。

ØgetXxx(Object obj):获取obj对象该Field的属性值。此处的Xxx对应8个基本数据类型,如果该属性类型是引用类型则直接使用get(Object obj)。

ØsetXxx(Object obj,Xxxval):将obj对象的该Field设置成val值。此处的Xxx对应8个基本数据类型,如果该属性类型是引用类型则直接使用set(Object obj,Object val)。

ØsetAccessible(Boolean flag):Field类从父类AccessibleObject中继承的方法。若flag为true,则取消属性的访问权限控制,即使private属性也可以进行访问;若flag为false,则取消属性的访问权限控制,private属性也可以进行访问。

Classclazz=Class.forName('cn.bsw.reflection.Student'); Objectobj=clazz.newInstance();

//调用getDeclaredField('name')方法取得name属性对应的Field对象。

Fieldf=clazz.getDeclaredField('name');

//取消属性的访问权限控制,即使private属性也可以进行访问。

f.setAccessible(true);

//调用get()方法获取并输出对应属性值。

System.out.println(f.get(obj));

//调用set()方法给对应属性赋值。

f.set(obj,'lkl');

//调用get()方法获取并输出对应属性修改后的值。

System.out.println(f.get(obj));

3. 运行时调用method通过Class对象的getMethods()或者getMethod()方法可以获得该类所包括的全部方法或指定方法,这两个方法的返回值是Method[]或者Method。每个Method对象对应一个方法,获得Method对象后,就可以调用它的invoke()方法来调用对应方法。

ØObject invoke(Objectobj,Object [] args):obj代表当前方法所属的对象的名字,args代表当前方法的参数列表,返回值Object是当前方法的返回值,即执行当前方法的结果。

public classInvokeMethod {

 

查看相关论文专题
加入收藏  打印本文
上一篇论文:Java多线程同步机制在售票系统的实现
下一篇论文:Java技术在XML和数据库通信技术中的应用
科技论文分类
科技小论文 数学建模论文
数学论文 节能减排论文
数学小论文 低碳生活论文
物理论文 建筑工程论文
网站设计论文 农业论文
图书情报 环境保护论文
计算机论文 化学论文
机电一体化论文 生物论文
网络安全论文 机械论文
水利论文 地质论文
交通论文
相关计算机论文
最新计算机论文
读者推荐的计算机论文