java的问题

zhaozheng821018 2012-06-19 10:15:00
Object object = new Object();
……
String str = (String)object;
这里的颜色部分的运行是怎么个过程啊?
我只是知道将object强行转换城string型,至于这个中间是怎么回事,不清楚!有谁能帮忙么?
...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaozheng821018 2012-06-21
  • 打赏
  • 举报
回复

package test;

import hibernate.sysuser.SysUsers;
import hibernate.sysuser.SysUsersDAO;

import java.lang.reflect.Method;

public class dealw {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

}

public void tt(Object obj,Class cls){
try{
System.out.println(cls.getName());
System.out.println(obj instanceof SysUsers);
Class c = Class.forName(cls.getName()+"DAO");
Method m[] = c.getDeclaredMethods();
for(int i = 0;i<m.length;i++){
if(m[i].getName().toUpperCase().equals("SAVE")){
m[i].invoke(c, obj);//报错部分
}
}
}catch(Exception e){
e.printStackTrace();
}
}

}
zhaozheng821018 2012-06-21
  • 打赏
  • 举报
回复
在数据库中建立一系列表,比如下面的sysuser表,在经过hibernate反向工程以后生成下面的几个类

package hibernate.sysuser;

import java.util.Date;

/**
* AbstractSysUsers generated by MyEclipse Persistence Tools
*/

public abstract class AbstractSysUsers implements java.io.Serializable {

// Fields

private Long id;

private String userid;

private String username;

private String remark;

private String workid;

private String operaterid;

private Date operatedate;

private String password;

private String workplace;

// Constructors

/** default constructor */
public AbstractSysUsers() {
}

/** full constructor */
public AbstractSysUsers(String userid, String username, String remark,
String workid, String operaterid, Date operatedate,
String password, String workplace) {
this.userid = userid;
this.username = username;
this.remark = remark;
this.workid = workid;
this.operaterid = operaterid;
this.operatedate = operatedate;
this.password = password;
this.workplace = workplace;
}

// Property accessors

public Long getId() {
return this.id;
}

public void setId(Long id) {
this.id = id;
}

public String getUserid() {
return this.userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getUsername() {
return this.username;
}

public void setUsername(String username) {
this.username = username;
}

public String getRemark() {
return this.remark;
}

public void setRemark(String remark) {
this.remark = remark;
}

public String getWorkid() {
return this.workid;
}

public void setWorkid(String workid) {
this.workid = workid;
}

public String getOperaterid() {
return this.operaterid;
}

public void setOperaterid(String operaterid) {
this.operaterid = operaterid;
}

public Date getOperatedate() {
return this.operatedate;
}

public void setOperatedate(Date operatedate) {
this.operatedate = operatedate;
}

public String getPassword() {
return this.password;
}

public void setPassword(String password) {
this.password = password;
}

public String getWorkplace() {
return this.workplace;
}

public void setWorkplace(String workplace) {
this.workplace = workplace;
}

}



package hibernate.sysuser;

// Generated by MyEclipse Persistence Tools

import java.util.Date;

/**
* SysUsers generated by MyEclipse Persistence Tools
*/
public class SysUsers extends AbstractSysUsers implements java.io.Serializable {

// Constructors

/** default constructor */
public SysUsers() {
}

/** full constructor */
public SysUsers(String userid, String username, String remark,
String workid, String operaterid, Date operatedate,
String password, String workplace) {
super(userid, username, remark, workid, operaterid, operatedate,
password, workplace);
}

}


package hibernate.sysuser;

import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.criterion.Example;

/**
* Data access object (DAO) for domain model class SysUsers.
*
* @see hibernate.sysuser.SysUsers
* @author MyEclipse Persistence Tools
*/

public class SysUsersDAO extends BaseHibernateDAO {
private static final Log log = LogFactory.getLog(SysUsersDAO.class);

// property constants
public static final String USERID = "userid";

public static final String USERNAME = "username";

public static final String REMARK = "remark";

public static final String WORKID = "workid";

public static final String OPERATERID = "operaterid";

public static final String PASSWORD = "password";

public static final String WORKPLACE = "workplace";

public void save(SysUsers transientInstance) {
log.debug("saving SysUsers instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}

public void commit(){
log.debug("commit trans");
getSession().beginTransaction().commit();
}

public void delete(SysUsers persistentInstance) {
log.debug("deleting SysUsers instance");
try {
getSession().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}

public SysUsers findById(java.lang.Long id) {
log.debug("getting SysUsers instance with id: " + id);
try {
SysUsers instance = (SysUsers) getSession().get(
"hibernate.sysuser.SysUsers", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}

public List findByExample(SysUsers instance) {
log.debug("finding SysUsers instance by example");
try {
List results = getSession().createCriteria(
"hibernate.sysuser.SysUsers").add(Example.create(instance))
.list();
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}

public List findByProperty(String propertyName, Object value) {
log.debug("finding SysUsers instance with property: " + propertyName
+ ", value: " + value);
try {
String queryString = "from SysUsers as model where model."
+ propertyName + "= ?";
Query queryObject = getSession().createQuery(queryString);
queryObject.setParameter(0, value);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}

public List findByUserid(Object userid) {
return findByProperty(USERID, userid);
}

public List findByUsername(Object username) {
return findByProperty(USERNAME, username);
}

public List findByRemark(Object remark) {
return findByProperty(REMARK, remark);
}

public List findByWorkid(Object workid) {
return findByProperty(WORKID, workid);
}

public List findByOperaterid(Object operaterid) {
return findByProperty(OPERATERID, operaterid);
}

public List findByPassword(Object password) {
return findByProperty(PASSWORD, password);
}

public List findByWorkplace(Object workplace) {
return findByProperty(WORKPLACE, workplace);
}

public List findAll() {
log.debug("finding all SysUsers instances");
try {
String queryString = "from SysUsers";
Query queryObject = getSession().createQuery(queryString);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}

public SysUsers merge(SysUsers detachedInstance) {
log.debug("merging SysUsers instance");
try {
SysUsers result = (SysUsers) getSession().merge(detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}

public void attachDirty(SysUsers instance) {
log.debug("attaching dirty SysUsers instance");
try {
getSession().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}

public void attachClean(SysUsers instance) {
log.debug("attaching clean SysUsers instance");
try {
getSession().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
}


然后我做了个测试

package test;

import hibernate.sysuser.SysUsers;
import hibernate.sysuser.SysUsersDAO;

import java.lang.reflect.Method;

public class dealw {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

}

public void tt(Object obj,Class cls){
try{
System.out.println(cls.getName());
System.out.println(obj instanceof SysUsers);
Class c = Class.forName(cls.getName()+"DAO");
Method m[] = c.getDeclaredMethods();
for(int i = 0;i<m.length;i++){
if(m[i].getName().toUpperCase().equals("SAVE")){
m[i].invoke(c, obj);
}
}
}catch(Exception e){
e.printStackTrace();
}
}

}


测试的主类

package test;

import java.util.Date;
import java.util.HashMap;
import hibernate.sysuser.SysUsers;
import hibernate.sysuser.SysUsersDAO;
import java.util.Map;
public class mytest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SysUsersDAO sud = new SysUsersDAO();
SysUsers su = new SysUsers();
su.setOperatedate(new Date());
su.setOperaterid("zz");
su.setPassword("zz");
su.setUserid("zz");
su.setUsername("zz");
su.setWorkid("10");
su.setWorkplace("here");
dealw dw = new dealw();
dw.tt(su,su.getClass());
}
}


结果在红色部分报错object is not an instance of declaring class

我这个测试的目的是,有一个公共的方法能把不同的bean存入对应的表中
zhaozheng821018 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
你这样写肯定错,你的迭代处理和你这样写有很大的区别,因为迭代的时候容器里保存的就是子类的对象
你改成
Object object = new String(); //这样就不会出错了,LZ好好体会吧
……
String str = (String)object;

至于为什么能转换,就像3L说的,对象是带有类型信息的
强行转换在编译期并不会报错,只有在运行期在转换过程中类型不符合才会抛出转换异常
如果LZ学过C的指针,对于转换可能就容易理解了
A *a = new B(); //a指针指向B对象的内存
B *b = (B*)a; //把a的内存地址转换为B类型的指针赋值给b
也就是说,a和b指向的是同一个内存地址,但是a访问的内存区域和b访问的内存区域不一样,比如内存地址是0x00,a可能能访问的区域范围是0x00-0x80,b可能能访问的范围是0x00-0xff,也就是说子类对象有一部分区域是属于父类的,这也就是为什么子类构造的时候会调用父类构造器的原因(因为父类区域的内存初始化时由父类构造方法来完成的)
[/Quote]
受教了,在实际写的过程中是有碰到过这种情况,在定一个Object数组后直接赋值会报错,但是给Object数组初始化一下就不会出问题了,你说的我能理解。可能是我的这个问题没有说明吧!
qybao 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
你这个写法不出错就怪了。。。

应该是:
String str = String.valueOf(object);

我们暂时不去讨论这个写法的正确和错误的情况,我想要知道的是强转转换的过程,java是怎么样去识别对象object的目标类型的,比如说有Class A 需要将一个Object转换成A,那么就是(A)Object。
另外我的这个写法应该没有错,我们……
[/Quote]

你这样写肯定错,你的迭代处理和你这样写有很大的区别,因为迭代的时候容器里保存的就是子类的对象
你改成
Object object = new String(); //这样就不会出错了,LZ好好体会吧
……
String str = (String)object;

至于为什么能转换,就像3L说的,对象是带有类型信息的
强行转换在编译期并不会报错,只有在运行期在转换过程中类型不符合才会抛出转换异常
如果LZ学过C的指针,对于转换可能就容易理解了
A *a = new B(); //a指针指向B对象的内存
B *b = (B*)a; //把a的内存地址转换为B类型的指针赋值给b
也就是说,a和b指向的是同一个内存地址,但是a访问的内存区域和b访问的内存区域不一样,比如内存地址是0x00,a可能能访问的区域范围是0x00-0x80,b可能能访问的范围是0x00-0xff,也就是说子类对象有一部分区域是属于父类的,这也就是为什么子类构造的时候会调用父类构造器的原因(因为父类区域的内存初始化时由父类构造方法来完成的)



MiceRice 2012-06-19
  • 打赏
  • 举报
回复
对象本身就带着其自身的类型,类型有存在其父子继承关系,所以这个对于Java来说很自然。

System.out.println(obj.getClass());

强转要求被转换类型确实是其子类才行,也就是必须符合:
if (obj instanceof String) {
String str = (String) obj;
}
zhaozheng821018 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你这个写法不出错就怪了。。。

应该是:
String str = String.valueOf(object);
[/Quote]
我们暂时不去讨论这个写法的正确和错误的情况,我想要知道的是强转转换的过程,java是怎么样去识别对象object的目标类型的,比如说有Class A 需要将一个Object转换成A,那么就是(A)Object。
另外我的这个写法应该没有错,我们在迭代的时候经常是这么写,肯能有特殊的情况下这么写会错,但是我想应该不会多的吧!
MiceRice 2012-06-19
  • 打赏
  • 举报
回复
你这个写法不出错就怪了。。。

应该是:
String str = String.valueOf(object);

50,531

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧