Java类的考察对象存在的主要问题和缺点问题

StringBuffer类的概述  * A:StringBuffer类概述     * 通过JDK提供的API,查看StringBuffer类的说明     * 线程安全的可变字符序列   * B:StringBuffer和String的区别     * String是一个不可变的字符序列     * StringBuffer是一个可变的字符序列
StringBuffer类的构造方法  * A:StringBuffer的构造方法:     * public StringBuffer():无参构造方法     * public StringBuffer(int capacity):指定容量的字符串缓冲区对象     * public StringBuffer(String str):指定字符串内容的字符串缓冲区对象  * B:StringBuffer的方法:     * public int capacity():返回当前容量。 理论值(不掌握)     * public int length():返回长度(字符数)。 实际值
StringBuffer的添加功能  * A:StringBuffer的添加功能     * public StringBuffer append(String str):
    * 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身     * public StringBuffer insert(int offset,String str):
    * 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
StringBuffer的删除功能  * A:StringBuffer的删除功能     * public StringBuffer deleteCharAt(int index):
    * 删除指定位置的字符,并返回本身     * public StringBuffer delete(int start,int end):
    * 删除从指定位置开始指定位置结束的内容,并返回本身
StringBuffer的替换和反转功能  * A:StringBuffer的替换功能     * public StringBuffer replace(int start,int end,String str):
    * 从start开始到end用str替换  * B:StringBuffer的反转功能     * public StringBuffer reverse():
    * 字符串反转
StringBuffer的截取功能及注意事项  * A:StringBuffer的截取功能     * public String substring(int start):
    * 从指定位置截取到末尾     * public String substring(int start,int end):
    * 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置  * B:注意事项     * 注意:返回值类型不再是StringBuffer本身
StringBuffer和String的相互转换  * A:String -- StringBuffer     * a:通过构造方法     * b:通过append()方法  * B:StringBuffer -- String     * a:通过构造方法     * b:通过toString()方法     * c:通过subString(0,length);
StringBuffer和StringBuilder的区别  * A:StringBuilder的概述     * 通过查看API了解一下StringBuilder类  * B:面试题     * String,StringBuffer,StringBuilder的区别     * StringBuffer和StringBuilder的区别     * StringBuffer是jdk1.0版本的,是线程安全的,效率低     * StringBuilder是jdk1.5版本的,是线程不安全的,效率高
* String和StringBuffer,StringBuilder的区别   * String是一个不可变的字符序列   * StringBuffer,StringBuilder是可变的字符序列
  String和StringBuffer分别作为参数传递  * A:形式参数问题     * String作为参数传递
    * A:Arrays类概述     * 针对数组进行操作的工具类。     * 提供了排序,查找等功能。  * B:成员方法     * public static String toString(int[] a)     * public static void sort(int[] a)     * public static int binarySearch(int[] a,int key)
基本类型包装类的概述  * A:为什么会有基本类型包装类     * 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。  * B:常用操作     * 常用的操作之一:用于基本数据类型与字符串之间的转换。  * C:基本类型和包装类的对应
    byte
    short
    int
    long
    float
    double
    char
    boolean
Integer类的概述和构造方法  * A:Integer类概述     * 通过JDK提供的API,查看Integer类的说明
    * Integer 类在对象中包装了一个基本类型 int 的值,     * 该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,     * 还提供了处理 int 类型时非常有用的其他一些常量和方法  * B:构造方法     * public Integer(int value)     * public Integer(String s)
String和int类型的相互转换  * A:int -- String     * a:和""进行拼接     * b:public static String valueOf(int i)     * c:int -- Integer -- String(Integer类的toString方法())     * d:public static String toString(int i)(Integer类的静态方法)  * B:String -- int     * a:String -- Integer -- int     * public static int parseInt(String s)
阅读(...) 评论()如果我在主类里实例化另一个类的对象,而另一个类里又必须有个死循环,那么怎么才能把控制权返回给主类呢!这是我在编写网络通迅程序时碰到的问题,希望会的朋友能帮帮忙!~
public class A{
public static void main(String[] args){
//主类要做的在这,main线程所做的
new Thread(new B()).start();//启动run中的内容
/*此时有两个线程,一个是main线程,另一个是B所实现的
线程,此时就不存在控制权如何交给主线程(main)问题,
虚拟机使用权时而给main,时而给B*/
另一个类:
public class B implements Runnable{
public void run(){
//具体代码在这实现
while(true){//楼主所说的while死循环}
//其他属性方法或是构造函数在这忽略,自己填上去
在线程中定义一个状态变量,如果想停止这个线程,设置这个状态变量,在run的while条件对这个状态变量进行判断就可以了
不过这样要等线程的一次处理结束才会停止,...
Java多线程需要我们不断的进行完善,相关的技术如何才能更好的使用,在这个问题上不少开发者和使用者都很关心。下面我们先来看看如何才能更好的学习Java多线程的使...
最后那几行:
int s = in.nextByte();
if (s == 'Y' || s =='y') {
System.out.println("OK"...
一个是new多线程类的时候就启动了,一个是new后再启动,基本没啥区别。
希望能帮助你。
(前5的回答省略了)
A类对象的生成。
第一次生成的对象是用下面的方法吗?
public void a()
A a = new A();
答: 川软不错,课程比较实际,动手的也很多。可以自己去当面了解一下
public class A{
public static void main(String[] args){
//主类要做的在这,main线程所做的
工行的网银没有软键盘,主要通过安全控件来保证安全,只有安装了工行的安全控件,才能在工行网页上输入密码。
修改密码的操作,你可以在登陆工行网银以后,在“客户服务”的“修改客户密码”里找到相关链接。
如果是下拉的,只有党员而没有预备党员一项,可填党员,但如果是填写的,你就老老实实填预备党员,填成党员对你没什么好处,填预备党员也不会有什么吃亏。
对于由非金属通过共价键形成的化合物,极性与否不是看键是不是极性的.而是要分析几个键之间的相互作用力是否可以抵消,像CO2是直线型的,结构式为:O=C=O,作用力等效作用于碳原子两边,按物理上的受力分析来看,不正好得以抵消吗?而SO2由于受力方向不同,就无法达到这样的效果.
平时做的练习里也常常会出现让你写一下分子构型或是电子式的,出现频率较高的有:NH3(三角锥型),CH4(正四面体),CO2(直线型),像过氧化物的有时也会让你写一下电子式.这些一般讲知识点的时候老师都会提及到的.
tann转成假名就是たん,拼音的话,相当于tang吧……
bakka转成假名是ばっか
kkou转成假名是っこう
benn转成假名是べん
kyo转成假名是きょ
系统学过五十音的话,看罗马音就能直接读了。用拼音来学是不合适的,有些发音没法用拼音标的。
P.S.罗马音里,“nn”就是波音“ん”,“kka”是前面带促音小写“っ”的“か”,同理“tta”就等于“った”。
考虑是由于天气比较干燥和身体上火导致的,建议不要吃香辣和煎炸的食物,多喝水,多吃点水果,不能吃牛肉和海鱼。可以服用(穿心莲片,维生素b2和b6)。也可以服用一些中药,如清热解毒的。
确实没有偿还能力的,应当与贷款机构进行协商,宽展还款期间或者分期归还; 如果贷款机构起诉到法院胜诉之后,在履行期未履行法院判决,会申请法院强制执行; 法院在受理强制执行时,会依法查询贷款人名下的房产、车辆、证券和存款;贷款人名下没有可供执行的财产而又拒绝履行法院的生效判决,则有逾期还款等负面信息记录在个人的信用报告中并被限制高消费及出入境,甚至有可能会被司法拘留。
第一步:教育引导
不同年龄阶段的孩子“吮指癖”的原因不尽相同,但于力认为,如果没有什么异常的症状,应该以教育引导为首要方式,并注意经常帮孩子洗手,以防细菌入侵引起胃肠道感染。
第二步:转移注意力
比起严厉指责、打骂,转移注意力是一种明智的做法。比如,多让孩子进行动手游戏,让他双手都不得闲,或者用其他的玩具吸引他,还可以多带孩子出去游玩,让他在五彩缤纷的世界里获得知识,增长见识,逐渐忘记原来的坏习惯。对于小婴儿,还可以做个小布手套,或者用纱布缠住手指,直接防止他吃手。但是,不主张给孩子手指上“涂味”,比如黄连水、辣椒水等,以免影响孩子的胃口,黄连有清热解毒的功效,吃多了还可导致腹泻、呕吐。
合肥政务区网络广告推广网络推广哪家公司比较好 一套能在互联网上跑业务的系统,被网络营销专家赞为目前最 有效的网络推广方式!
1、搜索引擎营销:分两种SEO和PPC,即搜索引擎优化,是通过对网站结构、高质量的网站主题内容、丰富而有价值的相关性外部链接进行优化而使网站为用户及搜索引擎更加友好,以获得在搜索引擎上的优势排名为网站引入流量。
良工拥有十多位资深制冷维修工程师,十二年生产与制造经验,技术力量雄厚,配有先进的测试仪器,建有系列低温测试设备,备有充足的零部件,包括大量品牌的压缩机,冷凝器,蒸发器,水泵,膨胀阀等备品库,能为客户提供迅捷,优质的工业冷水机及模温机维修和保养。
楼主,龙德教育就挺好的,你可以去试试,我们家孩子一直在龙德教育补习的,我觉得还不错。
成人可以学爵士舞。不过对柔软度的拒绝比较大。  不论跳什么舞,如果要跳得美,身体的柔软度必须要好,否则无法充分发挥出理应的线条美感,爵士舞也不值得注意。在展开暖身的弯曲动作必须注意,不适合在身体肌肉未几乎和暖前用弹振形式来做弯曲,否则更容易弄巧反拙,骨折肌肉。用静态方式弯曲较安全,不过也较必须耐性。柔软度的锻炼动作之幅度更不该超过疼痛的地步,肌肉有向上的感觉即可,动作(角度)保持的时间可由10馀秒至30-40秒平均,时间愈长对肌肉及关节附近的联结的组织之负荷也愈高。
正在加载...
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415Java中的对象转型 | 基于实例代码分步讲解 一站式学习Java | how2j.cn
本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器
如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)
走神了?退回10秒
首先,明确引用类型与对象类型的概念在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad对象是有类型的, 是ADHero引用也是有类型的,是ADHero通常情况下,引用类型和对象类型是一样的接下来要讨论的类型转换的问题,指的是引用类型和对象类型不一致的情况下的转换问题
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
所谓的转型,是指当引用类型和对象类型不一致的时候,才需要进行类型转换类型转换有时候会成功,有时候会失败(参考)到底能否转换成功? 教大家一个很简单的判别办法把右边的当做左边来用,看说得通不Hero h = new Hero();ADHero ad = new ADHero();h =右边ad引用所指向的对象的类型是 物理攻击英雄左边h引用的类型是 普通英雄把物理攻击英雄 当做 普通英雄,说不说得通? 说得通,就可以转所有的子类转换为父类,都是说得通的。比如你身边的例子苹果手机 继承了 手机,把苹果手机当做普通手机使用怡宝纯净水 继承了 饮品, 把怡宝纯净水 当做饮品来使用苍老师 继承了动物, 把苍老师 。。。
public class Hero {
public static void main(String[] args) {
Hero h = new Hero();
ADHero ad = new ADHero();
//类型转换指的是把一个引用所指向的对象的类型,转换为另一个引用的类型
//把ad引用所指向的对象的类型是ADHero
//h引用的类型是Hero
//把ADHero当做Hero使用,一定可以
父类转子类,有的时候行,有的时候不行,所以必须进行强制转换。强制转换的意思就是 转换有风险,风险自担。什么时候行呢?1.
Hero h =new Hero();2.
ADHero ad = new ADHero();3.
ad = (ADHero)第3行,是子类转父类,一定可以的第4行,就是父类转子类,所以要进行强转。h这个引用,所指向的对象是ADHero, 所以第4行,就会把ADHero转换为ADHero,就能转换成功。什么时候转换不行呢?1.
Hero h =new Hero();2.
ADHero ad = new ADHero();3.
Support s =new Support();4.
ad = (ADHero)h;第4行,是子类转父类,是可以转换成功的第5行,是把h引用所指向的对象 Support,转换为ad引用的类型ADHero。 从语义上讲,把物理攻击英雄,当成辅助英雄来用,说不通,所以会强制转换失败,并且抛出以下是对完整的代码的关键行分析14行: 把ad当做Hero使用,一定可以转换之后,h引用指向一个ad对象15行: h引用有可能指向一个ad对象,也有可能指向一个support对象所以把h引用转换成AD类型的时候,就有可能成功,有可能失败因此要进行强制转换,换句话说转换后果自负到底能不能转换成功,要看引用h到底指向的是哪种对象在这个例子里,h指向的是一个ad对象,所以转换成ADHero类型,是可以的16行:把一个support对象当做Hero使用,一定可以转换之后,h引用指向一个support对象17行:这个时候,h指向的是一个support对象,所以转换成ADHero类型,会失败。失败的表现形式是抛出异常 ClassCastException 类型转换异常
import charactor1.S
public class Hero {
public static void main(String[] args) {
Hero h =new Hero();
ADHero ad = new ADHero();
Support s =new Support();
ad = (ADHero)
ad = (ADHero)h;
import charactor1.S
public class Hero {
public static void main(String[] args) {
Hero h =new Hero();
ADHero ad = new ADHero();
Support s =new Support();
ad = (ADHero)
ad = (ADHero)h;
没有继承关系的两个类,互相转换,一定会失败虽然ADHero和APHero都继承了Hero,但是彼此没有互相继承关系&把魔法英雄当做物理英雄来用&,在语义上也是说不通的
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
APHero ap = new APHero();
// 没有继承关系的类型进行互相转换一定会失败,所以会出现编译错误
ad = (ADHero)
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
APHero ap = new APHero();
// 没有继承关系的类型进行互相转换一定会失败,所以会出现编译错误
ad = (ADHero)
引用ad指向的对象是ADHero类型,这个类型实现了AD接口10行: 把一个ADHero类型转换为AD接口从语义上来讲,把一个ADHero当做AD来使用,而AD接口只有一个physicAttack方法,这就意味着转换后就有可能要调用physicAttack方法,而ADHero一定是有physicAttack方法的,所以转换是能成功的。
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
10行: ad引用指向ADHero, 而adi引用是接口类型:AD,实现类转换为接口,是向上转型,所以无需强制转换,并且一定能成功12行: adi实际上是指向一个ADHero的,所以能够转换成功14行: adi引用所指向的对象是一个ADHero,要转换为ADAPHero就会失败。 假设能够转换成功,那么就可以使用magicAttack方法,而adi引用所指向的对象ADHero是没有magicAttack方法的。
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
ADHero adHero = (ADHero)
ADAPHero adapHero = (ADAPHero)
adapHero.magicAttack();
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
ADHero adHero = (ADHero)
ADAPHero adapHero = (ADAPHero)
adapHero.magicAttack();
instanceof Hero 判断一个引用所指向的对象,是否是Hero类型,或者Hero的子类
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
APHero ap = new APHero();
//判断引用h1指向的对象,是否是ADHero类型
System.out.println(h1 instanceof ADHero);
//判断引用h2指向的对象,是否是APHero类型
System.out.println(h2 instanceof APHero);
//判断引用h1指向的对象,是否是Hero的子类型
System.out.println(h1 instanceof Hero);
&姿势不对,事倍功半!
如下转换能否成功?如果不能,是哪一行会出错?为什么会出错
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
AD adi = (AD)
APHero ap = (APHero)
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
AD adi = (AD)
APHero ap = (APHero)
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器
如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)
走神了?退回10秒
11 行会出错,因为不能把ADHero转换为APHero,这两种类型之间没有关系
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
AD adi = (AD)
APHero ap = (APHero)
public class Hero {
public static void main(String[] args) {
ADHero ad = new ADHero();
AD adi = (AD)
APHero ap = (APHero)
把你的代码复制到下面区域。 如果在线比较不好用,请使用客户端比较软件:
代码高亮插件双击即可选中,不过部分同学反应,通过代码高亮插件复制的代码无法在IDEA里正常显示,这里提供TEXTAREA的方式,方便复制,谢谢
根据练习目标尽量自己实现代码效果,期间会碰到疑问,难题,和自己不懂的地方,这些都是必要的过程
完成过程中,碰到无法解决的问题,带着疑问,查看答案,分析答案的解决思路
依然有不明白的地方,点开视频讲解,带着疑问,听视频讲解有问题的部分
理解后,再从头做一遍,把有疑问的地方都捋清楚
最后再总结一遍,总结思路,总结解决办法,以后遇到类似的问题,怎么处理
把这时的想法,思路,研究都记录下来,等全部学完了,再回过头来巩固和理解,学习效果就会很好,知识点掌握得也牢固.
HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
Little_Monkey
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
cmaooooyuaaaan
答案时间:
TorstenLiu
答案时间:
TorstenLiu
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
无敌小兜兜
答案时间:
lucifer_lxf
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
巅峰小词典
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
语义上也好理解,把辅助英雄当普通英雄用,说的过去
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
提问之前请
欢庆八一建军节,全场五折,优惠码:81V5
可用于全站通
有效期7.30-8.1使用Cglib动态创建Java类,解决你意想不到的问题,让复杂变简单
我的图书馆
使用Cglib动态创建Java类,解决你意想不到的问题,让复杂变简单
在日常Java数据库开发中我们很少会用到自动创建Java类及类中的变量和方法,目前最常见的第三方数据库操作框架基本都要手动创建一个和数据库表一模一样的javabean,并提供每个字段对于的set,get方法,鉴于这种方式能否用一种方法只要一个数据库表名称,就可以返回一个对应该表的javabean的List列表或者其他集合,而完全不用创建一系列的Javabean呢? 答案是有,Java本身自带的类库目前好像还没有类似的功能,但是开源组织开发出一个jar包,就是cglib,目前的版本已经到cglib-nodep-2.1_3.jar,其底层采用asm动态创建字节码,对外只提供了很少的几个方法,而且也没有相应的API文档。所以学习起来比较难以下手。
下面我简单的介绍下如何使用cglib动态创建类。(例子是参考网上的)
2930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
package com.javase.util;import java.util.Iterator;import java.util.Map;import java.util.Set;import net.sf.cglib.beans.BeanGenerator;import net.sf.cglib.beans.BeanMap;public class CglibBeanUtil {&&&&public Object object = null;&&&&/**&&&& * 属性map&&&& */&&&&public BeanMap beanMap = null;&&&&public CglibBeanUtil() {&&&&&&&&super();&&&&}&&&&@SuppressWarnings("unchecked")&&&&public CglibBeanUtil(Map propertyMap) {&&&&&&&&this.object = generateBean(propertyMap);&&&&&&&&this.beanMap = BeanMap.create(this.object);&&&&}&&&&/**&&&& * 给bean属性赋值&&&& * &&&& * @param property&&&& *&&&&&&&&&&&&属性名&&&& * @param value&&&& *&&&&&&&&&&&&值&&&& */&&&&public void setValue(String property, Object value) {&&&&&&&&beanMap.put(property, value);&&&&}&&&&/**&&&& * 通过属性名得到属性值&&&& * &&&& * @param property&&&& *&&&&&&&&&&&&属性名&&&& * @return 值&&&& */&&&&public Object getValue(String property) {&&&&&&&&return beanMap.get(property);&&&&}&&&&/**&&&& * 得到该实体bean对象&&&& * &&&& * @return&&&& */&&&&public Object getObject() {&&&&&&&&return this.object;&&&&}&&&&@SuppressWarnings("unchecked")&&&&private Object generateBean(Map propertyMap) {&&&&&&&&BeanGenerator generator = new BeanGenerator();&&&&&&&&Set keySet = propertyMap.keySet();&&&&&&&&for (Iterator i = keySet.iterator(); i.hasNext();) {&&&&&&&&&&&&String key = (String) i.next();&&&&&&&&&&&&generator.addProperty(key, (Class) propertyMap.get(key));&&&&&&&&}&&&&&&&&return generator.create();&&&&}&&&&&&&&}//-----------------------------------------------------------------------------------------------------//下面是测试类package com.cglib.test;import java.lang.reflect.Method;import java.util.HashMap;import com.cglib.util.CglibBeanUtil;public class CglibTest { @SuppressWarnings("unchecked") public static void main(String[] args) throws ClassNotFoundException { // 设置类成员属性 HashMap propertyMap = new HashMap(); propertyMap.put("id", Class.forName("java.lang.Integer")); propertyMap.put("name", Class.forName("java.lang.String")); propertyMap.put("address", Class.forName("java.lang.String")); // 生成动态 Bean CglibBeanUtil bean = new CglibBeanUtil(propertyMap); // 给 Bean 设置值 bean.setValue("id", new Integer(123)); bean.setValue("name", "454"); bean.setValue("address", "789"); // 从 Bean 中获取值,当然了获得值的类型是 Object System.out.println(" && id = " + bean.getValue("id")); System.out.println(" && name = " + bean.getValue("name")); System.out.println(" && address = " + bean.getValue("address")); // 获得bean的实体 Object object = bean.getObject(); // 通过反射查看所有方法名 Class clazz = object.getClass(); System.out.println(clazz.getSimpleName()); Method[] methods = clazz.getDeclaredMethods(); for (int i = 0; i & methods.length; i++) { System.out.println(methods[i].getName()); } }}
通过以上例子我们可以发现,只要提供一个Map型的属性键值对(键是变量名,值是变量的类型),就可以创建出对应的类的所以字段(注意,cglib在给创建的字段前面都有前缀“$cglib_prop_”,使用时要注意,而类名是$cglib开头的如“net.sf.cglib.empty.Object$$BeanGeneratorByCGLIB$$b5c0bff6”,这个类是唯一的),并自动提供了每个字段的set,get方法。并且该类是生成在内存中,并没有生成在本地。
现在我们要做一种用底层jdbc操作数据只需根据表名返回的List&Object&型的集合,完全不用手动创建Javabean。
1:创建一个数据库连接工具类DBUtil
2:定义一个接口:ObjectDao,该接口包含方法
List&Object& getObjectList(Connection conn, String tableName);//通过表名和前台传的连接返回对象
//如果是一个完整的项目,一般数据库连接是固定的不会每次都是一个新的数据库连接。所以上面方法中的连接可以根据实际情况省掉,而只需一个全局的连接。
现在有个问题是,通过jdbc获取到该表的数据后,如果动态的将不同的表的字段和值能组装成一个类实例并放入List中,那么只能有一种方法那就是反射。要用反射那么我们就要用Class,所以上面接口的方法看着不能满足,
所以我们在上面接口再定义个方法
List&Object& getObjectList(Connection conn, Object ob, String tableName); //和上面的方法一样,只是剥离开重新调用了下
我们最终目的是用jdbc查询后返回的ResultSet和Class来组装成一个List&Object&,所以单独定义一个工具类
GenerateUtil,其中有个方法public static List&Object& generateObjectListFromDB(Class cls, ResultSet rs),这样在接口的实现类中最终调用这个工具类的方法就可以返回我们所要的集合了。
3:下面就要实现这个接口:ObjectDaoImpl
下面直接贴上代码:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
package com.javase.dao.impl;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.sql.Connection;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.HashMap;import java.util.List;import java.util.Map;import com.javase.dao.ObjectDao;import com.javase.db.DBUtil;import com.javase.util.CglibBeanUtil;import com.javase.util.GenerateUtil;public class ObjectDaoImpl implements ObjectDao{&&&&@Override&&&&public List&Object& getObjectList(Connection conn, String tableName)&&&&{&&&&&&&&Map&String, Class& columnMap = new HashMap&String, Class&();&&&&&&&&CglibBeanUtil beanUtil = null;&&&&&&&&String sql = "select * from " + tableName;&&&&&&&&Object ob = null;&&&&&&&&try&&&&&&&&{&&&&&&&&&&&&ResultSetMetaData rs = conn.prepareStatement(sql).executeQuery().getMetaData();&&&&&&&&&&&&for(int i = 1; i &= rs.getColumnCount(); i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&columnMap.put(rs.getColumnName(i), Class.forName(rs.getColumnClassName(i)));&&&&&&&&&&&&}&&&&&&&&&&&&ob = new CglibBeanUtil(columnMap).getObject();&&&&&&&&} catch (SQLException e)&&&&&&&&{&&&&&&&&&&&&e.printStackTrace();&&&&&&&&} catch (ClassNotFoundException e)&&&&&&&&{&&&&&&&&&&&&e.printStackTrace();&&&&&&&&}&&&&&&&&return this.getObjectList(conn, ob, tableName);&&&&}&&&&&&&&public List&Object& getObjectList(Connection conn, Object ob, String tableName)&&&&{&&&&&&&&String sql = "select * from " + tableName;&&&&&&&&ResultSet rs = null;&&&&&&&&List&Object& list = null;&&&&&&&&try&&&&&&&&{&&&&&&&&&&&&rs = conn.prepareStatement(sql).executeQuery();&&&&&&&&&&&&list = GenerateUtil.generateObjectListFromDB(ob.getClass(), rs);&&&&&&&&} catch (SQLException e)&&&&&&&&{&&&&&&&&&&&&e.printStackTrace();&&&&&&&&} finally&&&&&&&&{&&&&&&&&&&&&DBUtil.closeConnection(conn);&&&&&&&&}&&&&&&&&return list;&&&&}}
其中调用的工具生成类有2个,一个是CglibBeanUtil,和最上面的cglib例子一样,
另一个工具类是GenerateUtil
12345678910111213141516171819202122232425262728293031323334353637383940414243
package com.javase.util;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.sql.ResultSet;import java.util.LinkedList;import java.util.List;public class GenerateUtil{&&&&public static List&Object& generateObjectListFromDB(Class cls, ResultSet rs)&&&&{&&&&&&&&System.out.println(cls.getName());&&&&&&&&List&Object& list = new LinkedList&Object&();&&&&&&&&Field[] fields = cls.getDeclaredFields();&&&&&&&&try&&&&&&&&{&&&&&&&&&&&&while(rs.next())&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Object ob = cls.newInstance();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&for(int i = 0; i & fields.length; i++)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&String fieldName = fields[i].getName().replace("$cglib_prop_", "");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Method setMethod = cls.getDeclaredMethod(setMethodName, new Class[]{fields[i].getType()});&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&setMethod.invoke(ob, rs.getObject(fieldName));&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&list.add(ob);&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&} catch(Exception e)&&&&&&&&{&&&&&&&&&&&&e.printStackTrace();&&&&&&&&}&&&&&&&&&&&&&&&&return list;&&&&}}
所以我们对外提供的方法就是ObjectDaoImpl类的&getObjectList(Connection conn, String tableName),其中的数据库连接可以根据自己需要删掉换成全局的,再往外还可以包装对应的业务层Service及其ServiceImpl,完全根据自己实际需要。
最后我们用一个测试类:
12345678910111213141516171819202122
package com.javase.dao;import java.sql.Connection;import java.util.List;import com.javase.dao.impl.ObjectDaoImpl;import com.javase.db.DBUtil;public class test{&&&&public static void main(String[] args)&&&&{&&&&&&&&Connection conn = DBUtil.getConnection('O', "138.138.2.103", 1522, "SJPT", "TPS", "SJPTTPS");&&&&&&&&&&&&&&&&ObjectDaoImpl odi = new ObjectDaoImpl();&&&&&&&&&&&&&&&&List&Object& list = odi.getObjectList(conn, "TP_CD00101");&&&&&&&&&&&&&&&&System.out.println(list.size());&&&&&&&&&&&&}}
运行后完全正常
还有点是对事务的支持我没做,还有就是获得List&Object&后如何使用也没写,既然在daoImpl类中可以得到Class,那么再定义一个获取对于的Class的工具类,构造一个公共的方法获取List中对象的数据的方法即可,在这里我简单提下,方法参数就为(List&Object& list, Class class),在其中运用反射即可获取所有数据,这个由各位自己完成。
cglib的实例运用就说到这,谢谢
喜欢该文的人也喜欢

我要回帖

更多关于 四风方面存在的问题 的文章

 

随机推荐