仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 821|回复: 18
打印 上一主题 下一主题

[学习教程] JAVA编程:JAVA反射手艺(二)

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:44:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。Lesson:2处置对象
1.CreatingObjects
一样平常情形下,创立一个对象用以下办法
Rectangler=newRectangle();
但假如你正在开辟一个developmenttools,在运转之前也许不晓得要天生对象的类。
以是要像上面如许来创立对象:
StringclassName;

//...loadclassNamefromtheuserinterface

Objecto=new(className);//WRONG!


但以上是毛病的。
准确的办法是利用类的反射特征:


1)UsingNo-ArgumentConstructors
比方:
ClassclassDefinition=Class.forName(className);//指定类的运转期实例
object=classDefinition.newInstance();//挪用无参机关函数来天生指定类的实例。

2)UsingConstructorsthatHaveArguments
这个手艺要用到以下步骤:
a,创立一个Class对象
b,创立一个Constructor对象,getConstructor(Class[]params)办法,参数是一个与机关办法相合适的Class数组.
c,在Constructor对象上挪用newInstance办法来天生一个对象,参数是一个object数组与这个机关办法相装备。

比方:
importjava.lang.reflect.*;
importjava.awt.*;

classSampleInstance{

publicstaticvoidmain(String[]args){

Rectanglerectangle;
ClassrectangleDefinition;


Class[]intArgsClass=newClass[]{int.class,int.class};
Integerheight=newInteger(12);
Integerwidth=newInteger(34);
Object[]intArgs=newObject[]{height,width};

ConstructorintArgsConstructor;

try{
//1.
rectangleDefinition=Class.forName("java.awt.Rectangle");
//2.
intArgsConstructor=
rectangleDefinition.getConstructor(intArgsClass);//找到指定的机关办法
//3.
rectangle=
(Rectangle)createObject(intArgsConstructor,intArgs);//机关办法形貌对象,object[]
}catch(ClassNotFoundExceptione){
System.out.println(e);
}catch(NoSuchMethodExceptione){
System.out.println(e);
}
}

publicstaticObjectcreateObject(Constructorconstructor,
Object[]arguments){

System.out.println("Constructor:"+constructor.toString());
Objectobject=null;

try{
object=constructor.newInstance(arguments);
System.out.println("Object:"+object.toString());
returnobject;
}catch(InstantiationExceptione){
System.out.println(e);
}catch(IllegalAccessExceptione){
System.out.println(e);
}catch(IllegalArgumentExceptione){
System.out.println(e);
}catch(InvocationTargetExceptione){
System.out.println(e);
}
returnobject;
}
}



2。GettingFieldValues
Ifyouarewritingadevelopmenttoolsuchasadebugger,youmustbeabletoobtainfieldvalues.Thisisathree-stepprocess:
假如要作一个开辟工具像debugger之类的,你必需能发明filedvalues,以下是三个步骤:
a.创立一个Class对象
b.经由过程getField创立一个Field对象
c.挪用Field.getXXX(Object)办法(XXX是Int,Float等,假如是对象就省略;Object是指实
例).

比方:
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);
System.out.println("Height:"+heightValue.toString());
}catch(NoSuchFieldExceptione){
System.out.println(e);
}catch(SecurityExceptione){
System.out.println(e);
}catch(IllegalAccessExceptione){
System.out.println(e);
}
}
}

3。SettingFieldValues
a.创立一个Class对象
b.经由过程getField创立一个Field对象
c.挪用Field.set(Object,withparam)办法(XXX是Int,Float等,假如是对象就省略;Object是指实例,withparam指和这个字段相区配的字段。

importjava.lang.reflect.*;
importjava.awt.*;

classSampleSet{

publicstaticvoidmain(String[]args){
Rectangler=newRectangle(100,20);
System.out.println("original:"+r.toString());
modifyWidth(r,newInteger(300));
System.out.println("modified:"+r.toString());
}

staticvoidmodifyWidth(Rectangler,IntegerwidthParam){
FieldwidthField;
IntegerwidthValue;
Classc=r.getClass();
try{
widthField=c.getField("width");
widthField.set(r,widthParam);
}catch(NoSuchFieldExceptione){
System.out.println(e);
}catch(IllegalAccessExceptione){
System.out.println(e);
}
}
}

4。挪用指定的办法
a.创立一个Class对象
b.创立一个办法对象method,getMethod(StringmethodName,Class[])办法
c.调办法对象,method.invoke(object,Object[]),两个参数,第一个是指挪用办法所属于的对象,第二个是传送的值对象列表。

Thesampleprogramthatfollowsshowsyouhowtoinvokeamethoddynamically.TheprogramretrievestheMethodobjectfortheString.concatmethodandthenusesinvoketoconcatenatetwoStringobjects.
//


importjava.lang.reflect.*;

classSampleInvoke{

publicstaticvoidmain(String[]args){
StringfirstWord="Hello";//指定类的实例

StringsecondWord="everybody.";//变元


StringbothWords=append(firstWord,secondWord);
System.out.println(bothWords);
}

publicstaticStringappend(StringfirstWord,StringsecondWord){
Stringresult=null;
Classc=String.class;
Class[]parameterTypes=newClass[]{String.class};
MethodconcatMethod;
Object[]arguments=newObject[]{secondWord};
try{
concatMethod=c.getMethod("concat",parameterTypes);//猎取到办法对象
result=(String)concatMethod.invoke(firstWord,arguments);//挪用
}catch(NoSuchMethodExceptione){
System.out.println(e);
}catch(IllegalAccessExceptione){
System.out.println(e);
}catch(InvocationTargetExceptione){
System.out.println(e);
}
returnresult;
}
}




因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。
兰色精灵 该用户已被删除
沙发
发表于 2015-1-21 13:43:34 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
乐观 该用户已被删除
板凳
发表于 2015-1-21 16:03:50 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
冷月葬花魂 该用户已被删除
地板
发表于 2015-1-30 20:43:05 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
小魔女 该用户已被删除
5#
发表于 2015-2-8 20:39:42 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
蒙在股里 该用户已被删除
6#
发表于 2015-2-26 06:32:39 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
精灵巫婆 该用户已被删除
7#
发表于 2015-3-8 12:30:44 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
山那边是海 该用户已被删除
8#
发表于 2015-3-11 06:11:24 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
透明 该用户已被删除
9#
发表于 2015-3-13 06:28:00 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
小女巫 该用户已被删除
10#
发表于 2015-3-20 15:17:19 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
若天明 该用户已被删除
11#
发表于 2015-3-27 19:11:05 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
海妖 该用户已被删除
12#
发表于 2015-3-28 11:23:45 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
再见西城 该用户已被删除
13#
发表于 2015-4-3 23:27:10 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
柔情似水 该用户已被删除
14#
发表于 2015-4-5 12:09:34 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
简单生活 该用户已被删除
15#
发表于 2015-4-11 15:50:27 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
第二个灵魂 该用户已被删除
16#
发表于 2015-4-15 07:44:03 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
不帅 该用户已被删除
17#
发表于 2015-4-16 16:22:44 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
18#
发表于 2015-4-18 01:24:28 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
只想知道 该用户已被删除
19#
发表于 2015-4-26 13:11:44 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-13 01:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表