java 两个相同的对象属性值的比较

需求:比较两个相同的对象,得到不同的属性值的属性和属性值,后面才是重点:对像里面包含其他的对象,也要拿出来,例如:两个user对象,user里面包含部门,如果两个user下面的部门不一致,要得到分别的部门名称,user还有标签组(是个集合),如果不同也有得到,有办法做吗?

9个回答

反射遍历属性,遇到属性是对象的,递归比较

这里有个例子:


public class CompareObject {  
    public static void main(String[] args) {  
        Dog dog1 = new Dog("大师兄的dog", true, true);  
        Dog dog2 = new Dog("大师兄的dog", false, false);  
        List<Dog> dogs = Lists.newArrayList();  
        List<Dog> myDogs = Lists.newArrayList();  
        dogs.add(dog1);  
        myDogs.add(dog2);  
        List<String> boys = Lists.newArrayList("tom", "jerry", "jack");  
        //List<String> myBoys = Lists.newArrayList("tom", "jerry", "jack");//这行注释打开,下行代码注释掉,则boys属性就相同了  
        List<String> myBoys = Lists.newArrayList("tom hanks", "gery", "pul");  
        Car car1 = new Car("q7", 182, dogs, boys);  
        Car car2 = new Car("a6", 152, myDogs, myBoys);  
        contrastObj(car1, car2);  
    }  

    private static void contrastObj(Object obj1, Object obj2) {  
        if (obj1 instanceof Car && obj2 instanceof Car) {  
            Car pojo1 = (Car) obj1;  
            Car pojo2 = (Car) obj2;  
            List<String> textList = Lists.newArrayList();  
            try {  
                Class clazz = pojo1.getClass();  
                Field[] fields = pojo1.getClass().getDeclaredFields();  
                for (Field field : fields) {  
                    PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);  
                    Method getMethod = pd.getReadMethod();  
                    Object o1 = getMethod.invoke(pojo1);  
                    Object o2 = getMethod.invoke(pojo2);  
                    String s1 = o1 == null ? "" : o1.toString();//避免空指针异常  
                    String s2 = o2 == null ? "" : o2.toString();//避免空指针异常  
                    //思考下面注释的这一行:会bug的,虽然被try catch了,程序没报错,但是结果不是我们想要的  
                    //if (!o1.toString().equals(o2.toString())) {  
                    if (!s1.equals(s2)) {  
                        textList.add("不一样的属性:" + field.getName() + " 属性值:[" + s1 + "," + s2 + "]");  
                    }  
                }  
            } catch (Exception e) {  
                System.out.println(e.getMessage());  
            }  
            for (Object object : textList) {  
                System.out.println(object);  
            }  
        }  
    }  
}  

具体看这里:http://blog.csdn.net/qq_27093465/article/details/62453581

baidu_37252709
lPsycongroo 不是很懂,如果是对象,是怎么递归,能标注下吗
大约 2 年之前 回复

package com.zjk.utils;

import com.zjk.common.MyException;

import java.lang.reflect.Field;

public class CompareUtil {

public static String compareTwoClass(Object class1, Object class2) {
    StringBuilder sb = new StringBuilder();
    //获取对象的class
    try {
        Class<?> clazz1 = class1.getClass();
        Class<?> clazz2 = class2.getClass();
        //获取对象的属性列表
        Field[] field1 = clazz1.getDeclaredFields();
        Field[] field2 = clazz2.getDeclaredFields();
        //遍历属性列表field1
        for (int i = 0; i < field1.length; i++) {
            //遍历属性列表field2
            for (int j = 0; j < field2.length; j++) {
                //如果field1[i]属性名与field2[j]属性名内容相同
                if (!field1[i].getName().equals(field2[j].getName())) {
                    continue;
                }
                field1[i].setAccessible(true);
                field2[j].setAccessible(true);
                if (field2[j].get(class2) == null) {
                    break;
                }
                //如果field1[i]属性值与field2[j]属性值内容不相同
                if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
                    sb.append(field1[i].getName());
                    sb.append("【" + field1[i].get(class1));
                    sb.append("->" + field2[j].get(class2));
                    sb.append("】,");
                }
                break;
            }
        }
    } catch (Exception e) {
        throw new MyException(e.getMessage());
    }
    return sb.deleteCharAt(sb.length() - 1).toString();
}

public static boolean compareTwo(Object object1, Object object2) {
    if (object1 == null && object2 == null) {
        return true;
    }
    if (object1 == null && object2 != null) {
        return false;
    }
    if (object1.equals(object2)) {
        return true;
    }
    return false;
}

}

baidu_37252709
lPsycongroo 这个就是我现在用的代码,但是比较不了对象里面包含的对象
大约 2 年之前 回复

覆盖equals,然后递归调用equals

user对象继承自object,重写 object的 equals方法,自己定义equals方法,重写toString方法自己定义返回对象。

重载equals,将不同的值返回就可以

本身的equals方法比较的是地址值,如果是比较他们的内容(地址不一样,内容可能一样),那么需要重写equals方法,user比较之后,你再比较部门对象,类似

重写equals方法就可以实现这个需求.

两个对象比较的是地址值,属性比较的是equals方法

能不能弄个代码出来,如果是对象,递归这一步

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java两个同属性对象怎么进行比较
做一个修改操作记录要记录做修改操作前Person p1属性名属性值和修改后Person p2属性名属性值。
java对象属性的默认值影响sql查询语句的拼接,该如何处理。
1、问题描述: 想做一个通用的sql查询语句,通过传入对象的属性赋值情况,拼接查询语句。比如Admin类,有int id,String name,int age,boolean isLeader 4个属性,如果给Admin的对象的某几个属性赋值,比如:setAge(32);setName(“张”)。那么语句拼接为select * from admin where age=32 and name like '%张%'。我在拼接时本来想通过属性是否为null,或者是否为空字符来判断是否作为查询条件,但是由于默认值的存在,导致拼接错误。 2、代码 ``` /*** * 约定: * 1、类名与表名对应,表名全小写。 * 2、类属性与列名一致。 * 3、ID列的类属性和列名为=表名(第一个字母小写)+“Id” * * 4、暂不支持联表查询。 *类名:BaseDao * ***/ public <T> List<T> query(T t) throws IllegalArgumentException, IllegalAccessException, SQLException{ StringBuilder sql=new StringBuilder(); StringBuilder whereString=new StringBuilder(); List<Object> parameters=new ArrayList<Object>(); Class clazz=t.getClass(); //获取类名 String classSimpleName=clazz.getSimpleName(); //获取表名 String tableName=classSimpleName.toLowerCase(); //拼接select语句前半部分 sql.append("select * from "+tableName); //获取所有类属性 Field[] fields=clazz.getDeclaredFields(); //遍历所有属性 for(Field field:fields) { field.setAccessible(true); //得到属性值 Object fieldValue=field.get(t); if(fieldValue!=null) { //如果属性值不为null,获取属性名(字段名)。 String fieldName=field.getName(); //判断是否为String类型 if(fieldValue instanceof String) { // 如果是String,判断是否为空字符 if(!("".equals(((String)fieldValue).trim()))) { //不是空字符串,作为where条件,并将参数加入列表。 whereString.append(fieldName+" like ? and "); parameters.add("%"+(String)fieldValue+"%"); } }else if("Integer".equals(fieldValue.getClass().getSimpleName())){ /***判断是否为int,如果int>0,认为参数有效---这个也是为了处理默认值为0的情况,想的办法,但是有时候表里面字段值可能<=0,所以我觉得处理得不**好*/ if((int)fieldValue>0) { whereString.append(fieldName+"=? and "); parameters.add(fieldValue); } }else{ /*其他情况直接作为where查询条件,但是运行发现boolean值默认false,也会直接当成是有效条件,影响条件设置*/ whereString.append(fieldName+"=? and "); parameters.add(fieldValue); } } } //判断是否有有效条件,有的话拼接where语句。 if(parameters.size()>0) { whereString.delete(whereString.length()-5, whereString.length()-1); sql.append(" where "); sql.append(whereString); } System.out.println(sql.toString()); System.out.println(parameters); //连接数据库,查询。 QueryRunner qr=JdbcPool.getQueryRunner(); // return null; return qr.query(sql.toString(), new BeanListHandler<T>(clazz), parameters.toArray()); } ``` 3、测试代码 ``` @Test public void BaseDao() throws Exception, IllegalAccessException { IpAddress ipObj=new IpAddress(); //只设置了一个条件。 ipObj.setIpAddress("192.168.1"); BaseDao bd=new BaseDao(); List<IpAddress> list=bd.query(ipObj); for(IpAddress ip:list) { System.out.println(ip); } System.out.println(list.size()); } ``` 4、结果 ``` //在只设置了一个条件的情况下,拼接出两个查询条件。 select * from ipaddress where ipAddress like ? and isReachable=? [%192.168.1%, false] ``` 5、问题: 请问如何处理这种由于对象基本类型默认值,导致的拼接错误的问题?
如何通过java的反射 修改对象的属性的值
我想写一个方法,对一个对象的值进行修改, 例如:有一个对象叫user,里面有name,age,两个属性,想在实例化对象,new user("a","1"); 我想用一个方法,只要传入参数的名字,就能修改参数的值,例如:传入age和"1岁",把原来的对象修改为user("a","1岁"); 不要调用对象的set方法,利用java的反射 应该怎么写呢? 小弟在此谢过,求解!
Java两个类之间传值问题(初学)
# 背景简介 我在试着做飞机大战,想用jlabel做一个得分显示。 整个界面用JFrame搭建,两个jpanel,一号Jpanel用paint()画游戏界面,二号Jpanel用来放置jlabel,即用来显示分数。【我方飞机】、【敌机】、【子弹】、【爆炸效果】、【开始】、【画布】共六个类,paint()就在【画布】中,前四个类只有属性器和方法,【画布】里创建我方飞机、敌机和子弹的对象和其移动方法。 # 这里是正题 1. 【爆炸效果】里存在让碰撞后的子弹和敌机消失的方法,在此中需要调用Score值,增加分数。 2. 【画布】里的paint()联合repaint()会重复画图,调用【爆炸效果】(每次都是new Bomb(4个参数))。 3. 【开始】包含main入口,继承jframe,构造方法里做好基本局部,jpanel和jlabel就是在这里加的。 4.我在【画布】里另创一类GetScore继承jlabel,初始化int Score=0,属性器getter和setter完全正常,打印输出显示分数累加正常。传值到【开始】的一个方法start(int a)中,该方法打印输出同样显示分数值正常。但实际效果却是jlabel一直显示得分: 0. # 求教 如何能让jlabel变动,详略均可,谢谢! ``` import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JPanel; public class Start extends JFrame{ //这是画布类 Interface in = new Interface(); JPanel jp = new JPanel(); //得分方法类的实例 GetScore jl = new GetScore(); public String getJl() { return jl.getText(); } public void setJl(String str) { jl.setText(str); } Start(){ setTitle("飞机大战"); setSize(700, 800); setBounds(0, 0, 600, 800); setResizable(false); setVisible(true); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); //将显示分数的jlabel添加到面板中 jp.add(jl); new Thread(in).start(); this.add(in,BorderLayout.CENTER); jp.setSize(100, 700); this.add(jp,BorderLayout.WEST); this.addKeyListener(in); } Start(int a){ setJl("得分: "+a); System.out.println("jl:"+jl.getText()); } public static void main(String[] args) { new Start(); } } ``` ![图片说明](https://img-ask.csdn.net/upload/201607/04/1467644109_45110.png)
modelandview传集合参数到视图,集合内部的关联对象的属性值在视图中显示失败,后台没有报错
controller层通过modelandview携带参数fac集合至视图,有两个参数因为是关联对象里的属性,无法获取到值![图片说明](https://img-ask.csdn.net/upload/201905/28/1559005271_612078.jpg) 这是controller层 ![](https://img-ask.csdn.net/upload/201905/27/1558949079_711896.jpg) 这是目标视图的代码 ![图片说明](https://img-ask.csdn.net/upload/201905/28/1559005122_45096.jpg)![图片说明](https://img-ask.csdn.net/upload/201905/28/1559005129_350031.jpg) 这是fac实体类,标注的是两个关联对象 ![](https://img-ask.csdn.net/upload/201905/27/1558949114_619924.png)
springboot中form-data传值,不用@Requestbody修饰入参对象时,swagger-ui该怎么聚合它的属性
**1、环境描述**:在springboot+swagger v_2.9.2的环境下 前后端分离,restful风格接口。 **2、提问原因**:前后端约定使用form-data进行数据传递,后台接口入参很多都是: public String findPage(String pageNo, String pageSize, Batch entity)这样的, **调试好swagger接口文档后发现**:如果将参数Batch用@Requestbody修饰,接口文档中的参数parameter就是聚合显示,如果后台没有使用@Requestbody修饰,那么swagger将递归该参数对象Batch的所有属性,包括其中的Page<Batch>,具体如下图: (![两种接收参数方式对swagger-ui的影响](https://img-ask.csdn.net/upload/201908/20/1566316583_639624.png) **图片描述**:(不知道图片看的清不) 同一个接口,仅仅只是入参对象的修饰语不同,在swagger上居然区别这么大 左边的swagger上看起来是正常的,网络上很多人都是用这种@Requestbody方式,但是我们约定的是form-data,所以不能使用@Requestbody接收参数。而如果不用,那么swagger文档上看到的都是全部铺开的,不是很方便使用。 **3、我尝试过的方法** 1.我想过两个方向,一个是修改后台swagger处理数据的拼装逻辑,另一个方向是在页面端修改数据的位置和逻辑,也就是修改api-doc接口返回的数据, **==第一个方向**:修改后台swagger处理数据的拼装结构,借鉴了(https://blog.csdn.net/u010579482/article/details/79990536) 中的一个思路,重写子类覆盖swagger主要处理参数数据的ModelAttributeParameterExpander,到目前为止还没有解决。 **==第二个方向**:修改页面端api-doc接口返回的数据,根据图上两种方式的对比,我们可以发现: **被@Requestbody修饰的入参对象**,在swagger-ui的definitions中已经有了一个对象的定义或声明: ![被@Requestbody修饰](https://img-ask.csdn.net/upload/201908/20/1566306781_529537.png) ![图片说明](https://img-ask.csdn.net/upload/201908/20/1566306934_308277.png) **而没有被@Requestbody修饰的返回结果**,在swagger-ui里返回结果就直接是在path.post.parameters中平铺在一起,也就是不方便所在,如果入参对象里有子对象,那递归出来就是一大片了。如下图: ![图片说明](https://img-ask.csdn.net/upload/201908/20/1566308568_957422.png) **4、现状:**到目前为止,还没有解决这个问题,各位大佬有时间的话教育下小弟,小弟在线等着,还望大佬们不吝赐教,[感激][感激][感激]
两个对象之间数据传递,有特殊情况求教
举个简单的例子, 有4个对象 A,B,C,D AB属性完全相同,CD属性完全相同。但是其中有个list属性,A中的list属性 放着C对象的集合,B中的list属性 放着D对象的集合,现在要将A中的值赋给B,如何实现,或者说如何设计。。 A{ private Integer id; private List<C> myList; } B{ private Integer id; private List<D> myList; } C{ private Integer age; } C{ private Integer age; } 这个问题的需求在于,外部请求的参数对象,转换成我的内部对象,好进行下一步操作。
java的executor.submit()方法问题
请教各位大侠,下面这段java的代码,for循环里面的两个语句,为什么从第一个语句到第二个语句,对象solverinstance某些属性值会发生变化。 且调试的时候,我如果用“步入”,就直接从第一个语句跳到了第二个语句,我用的IDE是netbeans,只不过把java的类库给过滤了,并没有过滤自己的代码,不明白为什么solveinstance一些属性值发生变化了。 ``` for(AbstractPricingProblemSolver<T, U, V> solverInstance : bundle.solverInstances){ Future<Void> f=executor.submit(solverInstance); futures.add(f); } ``` executor.submit()执行的是下面的操作,没有看出来有对solverinstance操作啊。 ``` public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task); execute(ftask); return ftask; } ```
关于spring框架当取消bean标签默认的单例模式时多创建出来的对象是怎么来的?
今天本来在测试spel spring表达式赋值的,但是突然发现了一些问题,想请教一下大家, 这是我在测试时观察表达式传值时方便查看用this显示对象地址,区分到底是那个对象进入了方法,类名就是Users,就是一个普通的get/set方法 ``` public String getName() { System.out.println("getname"+"="+this); return name; } public void setName(String name) { System.out.println("setname"+"="+this); this.name = name; } ``` 但是当我使用spring框架在spring.xml文件中做spel spring表达式赋值练习时为了确认是否传值,把默认的单例模式取消掉了,为如下代码: ``` <bean id="u1" class="com.qf.bean.Users" scope="prototype"> <property name="name" value="张三"></property> <property name="age" value="15"></property> </bean> <bean id="u2" class="com.qf.bean.Users"> <property name="name" value="#{u1.name}"></property> <property name="age" value="#{u1.age}"></property> </bean> <bean id="u3" class="com.qf.bean.Users"> <property name="name" value="#{u1.name}"></property> <property name="age" value="#{u1.age}"></property> </bean> ``` u3是为了测试u1改为了多例后u2和u3的地址是否相同用的,可以不看,然后我在测试类中准备打印对象的属性观察是否成功赋值,写了如下代码,怎么看都是没有问题的 ``` ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml"); Users u1 = (Users) app.getBean("u1"); Users u2 = (Users) app.getBean("u2"); Users u3 = (Users) app.getBean("u3"); System.out.println("================"); System.out.println("u1 = " + u1); System.out.println(u1.getName() + "\t" + u1.getAge()); System.out.println("================"); System.out.println("u2 = " + u2); System.out.println(u2.getName() + "\t" + u2.getAge()); System.out.println("================"); System.out.println("u3 = " + u3); System.out.println(u3.getName() + "\t" + u3.getAge()); ``` 但是打印结果让我想不通为什么:结果为下述情况: ``` /*疑问 没有此对象 setname=com.qf.bean.Users@5c5a1b69 getname=com.qf.bean.Users@5c5a1b69 没有此对象 setname=com.qf.bean.Users@cd2dae5 u2 setname=com.qf.bean.Users@3a883ce7 没有此对象 setname=com.qf.bean.Users@79be0360 getname=com.qf.bean.Users@79be0360 没有此对象 setname=com.qf.bean.Users@22a67b4 u3 setname=com.qf.bean.Users@57855c9a u1 setname=com.qf.bean.Users@d44fc21 ================ u1 = com.qf.bean.Users@d44fc21 getname=com.qf.bean.Users@d44fc21 张三 15 ================ u2 = com.qf.bean.Users@3a883ce7 getname=com.qf.bean.Users@3a883ce7 张三 15 ================ u3 = com.qf.bean.Users@57855c9a getname=com.qf.bean.Users@57855c9a 张三 15 */ ``` 我是想问的我只有三个对象,走的<property name="name" value="#{u1.name}"></property>也应该是取一次值赋一次值,走一次get走一次set啊,为什么控制台输出的this地址会出来四个没用到也没出现的对象地址, 正常我三个对象,第一个应该直接走set赋值,第二个对象通过get获取第一个对象的值再set给自己,第三个也一样,那应该是走两次get方法,三次set方法,那么另外那么多次的getset方法是谁调用的?this的地址与我的三个对象地址完全不一样,那些地址是谁的?另外那四个我标注的看地址本应该不存在的地址对应的对象是怎么出来的?哪位大神能帮我说明一下,另外那四个对象是怎么来的?
求XML解析成JAVA对象工具
系统中有N多个XML文件,文件的格式如下: <?xml version="1.0" encoding="UTF-8"?> <plugin xmlns="http://www.example.org/plugin-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- 扩展点定义 --> <extension-point id="com.smart.point1"> <item name="myItme1"> <param name="params1" kind="string" required="true"> <description>参数说明1</description> </param> <param name="params2" kind="int" required="false"> <description>参数说明2</description> </param> <param name="params3" kind="string"> <description>参数说明3</description> </param> <description>ITEM说明1</description> </item> <item name="myItme2"> <param name="params1" kind="string" required="true"> <description>参数说明1</description> </param> <param name="params2" kind="int"> <description>参数说明2</description> </param> <description>ITEM说明2</description> </item> <description>扩展点说明</description> </extension-point> <!-- 扩展点实现 --> <extension point="com.smart.point1"> <item name="myItme2"> <param name="params1" value="这里是参数值1"/> <param name="params2" value="100"/> </item> </extension> <!-- 扩展点实现 --> <extension point="com.smart.point1"> <item name="myItme2"> <param name="params1" value="henry"/> <param name="params2" value="500"/> </item> </extension> </plugin> 文件2: <?xml version="1.0" encoding="UTF-8"?> <plugin xmlns="http://www.example.org/plugin-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- 扩展点实现 --> <extension point="com.smart.point1"> <item name="myItme1"> <param name="params1" value="hello"/> <param name="params3" value="50"/> </item> </extension> </plugin> 说明: 1. XML中存在有两个大类:extension-point(扩展点)和extension(扩展实现)。 2. extension-point(扩展点)节点有ID属性(全局唯一),extension(扩展实现)有point属性(此属性指向前者的ID属性)。 3. 无论是extension-point(扩展点)或extension(扩展实现)节点下,都有多个item子节点,此item节点只有一个name属性。 4. 在extension-point(扩展点)的item节点下,有多个param子节点,此节点有三个属性:name,就是名称,在此item节点中唯一。kind,是指在JAVA中的类型(如:string,int,date...)。required,是指此param是否是必须,默认为false 5. 在extension(扩展实现)的item节点下,也有多个param子节点,分别对应第4点中的param,只是属性只有2个:name,对应第4点中的name属性,value,指此属性的值,类型为第4点中定义的kind。注意:如果第4点中定义的param是required="true",那么此param节点就必须定义,否则可以不写。 6. extension-point(扩展点)中的description节点不需要处理。 要求: 1. 使用JAVA加载并解析所有的XML文件。 2. 提供一个工具类来获取XML文件中的数据。 2.1 如工具类:XMLLoader.java 2.2 通过工具类能获取到所有的扩展点数据:ExtensionPoint[] point = XMLLoader.getExtensionPoint(); 2.3 根据扩展点ID获取某个扩展点:ExtensionPoint point = XMLLoader.getExtensionPoint(pointId); 2.4 获取某个扩展点的所有扩展实现:Extension[] extensions = point.getExtensions(); 2.5 根据item名称获取扩展实现中的某个扩展实现:Extension extension = point.getExtensions(itemName);
Java SWT操作Excel(OLE),如何给单元格区域赋值?
import java.io.File; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.ole.win32.OLE; import org.eclipse.swt.ole.win32.OleAutomation; import org.eclipse.swt.ole.win32.OleClientSite; import org.eclipse.swt.ole.win32.OleFrame; import org.eclipse.swt.ole.win32.Variant; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; public class ExcelShell { public static void main(String[] args) { new ExcelShell().open(); } public void open() { Display display = Display.getDefault(); Shell shell = new Shell(); shell.setSize(600,400); shell.setText("Excel Window"); shell.setLayout(new FillLayout()); //使Excel的菜单栏显示 shell.setMenuBar(new Menu(shell,SWT.BAR)); createExcelPart(shell); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()) { } } display.sleep(); shell.dispose(); display.dispose(); } /** * 使Excel嵌入到shell中 * @param shell */ private void createExcelPart(Shell shell) { //OleFrame实际上是一个Composite,用于放置OLE控件 OleFrame oleFrame = new OleFrame(shell,SWT.NONE); //OleClientSite提供一个场所用于把OLE对象嵌入到容器中,在这里“Excel.Sheet”表示的OLE对象是Excel File file01=new File("D:"+File.separator+"ABC.xlsx"); OleClientSite clientSite = new OleClientSite(oleFrame, SWT.NONE, file01); setValueForA1Cell(clientSite); //OleClientSite在显示OLE对象时所做的动作,这里的动作是OLEIVERB_SHOW,显示 clientSite.doVerb(OLE.OLEIVERB_SHOW); } /** * Sheet的Id */ private static final int SHEET_ID = 0x000001e5; /** * 单元格的Id(Range) */ private static final int CELL_ID = 0x000000c5; /** * 单元格值的Id */ private static final int CELL_VALUE_ID = 0x00000006; /** * 为第一个Sheet页的A1单元格赋值 * @param clientSite */ /* * 原理: 使用SWT进行OLE操作时,所有的对OLE对象的引用都是通过OLE定义的Id获得, 所有的动作都通过OleAutomation对象进行,OleAutomation可以代表任一OLE对象,如Workbook、Worksheet、Range。 可以通过getProperty()方法获得它的属性,也可以用setProperty()方法为它的属性赋值 Variant对象一般是封装了OLE对象的值,可以通过它进行值传入及获得相应的值,也可以通过它获得OleAutomation对象 */ private void setValueForA1Cell(OleClientSite clientSite) { //获得Excel的workbook对象, //在这里OleClientSite对象就代表着Workbook对象,需要把OleClientSite转换成OleAutomation对象以便进行下一步动作 OleAutomation workbook = new OleAutomation(clientSite); /** * 获得workbook的第一个Sheet页, *需要知道Worksheet的Id(0x000001e5),因为在OLE中获得Worksheet的方法是的返回值是一个数组, *所以需要传入一个参数“1”,表示数组的第一个元素,在这里参数“1”是通 过new Variant[]{new Variant(1)}传入的 */ OleAutomation sheet = workbook.getProperty(SHEET_ID,new Variant[]{new Variant(1)}).getAutomation(); /** * 获得Sheet页的A1单元格 *在OLE中代表单元格的是Range,可以表示一个单元格也可以表示一个单元格区域。实际上一个单元格就是一个特殊的Range, *Range的Id是0x000000c5。Range是通过Worksheet 获得的,需要传入的参数为字符串(用Variant进行包装), *可以为一个(代表一个单元格,如new Variant[]{new Variant("A1")}), *也可以为两个(代表一个单元格区域,如new Variant[]{new Variant("A1"), new Variant("B2")}), *因为我们要对单元格进行赋值,所以需要获得Range的OleAutomation对象 */ Variant cellA1Variant = sheet.getProperty(CELL_ID ,new Variant[]{new Variant("A1"), new Variant("B2")}); OleAutomation cellA1_B2= cellA1Variant.getAutomation(); /** * 为A1单元格赋值,Range的值(Value)的属性的Id是0x00000006,在这里传入一个字符串作为单元格的值 */ cellA1_B2.setProperty(CELL_VALUE_ID , new Variant[] {new Variant("Heo"),new Variant("GGH"),,new Variant("OOP"),new Variant("COM")}); } } 注:采用cellA1_B2.setProperty赋4个值则不能成功,显示空白,也不报错 若cellA1_B2.setProperty只传入一个值,则四个单元格都能显示传入的值 **求教:如何能正确给四个单元格都赋值?** **附上所用SWT的OLE包 API地址:** http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fole%2Fwin32%2Fpackage-summary.html&cp=2_1_0_182 **所采用getProperty、setProperty方法在OleAutomation类里**
Java中JSON字符串指定某个key进行加密
Json字符串:{"code":"0000","success":true,"results":{"code":"0000","userId":364,"openid":"null","shopId":null,"brandId":66,"roleId":1,"entityName":null,"menuList":[{"id":258,"name":"xxx","pid":255,"type":2},{"id":259,"name":"xxx","pid":255,"type":2}],"loginName":"xxx"}} 需求:shopId,id 这两个属性值进行加密 有什么好的办法,正则替换什么的。 因为字符串内容是未知的,不能装换成JSON对象操作 已经解决了 ![图片说明](https://img-ask.csdn.net/upload/201712/15/1513305233_688827.png) ![图片说明](https://img-ask.csdn.net/upload/201712/15/1513305312_879649.png)
"main" java.lang.NullPointerException
//四、用Java实现掷骰子游戏:丢下两个骰子,若分值的总值为7点,则赢;否则输。 //编写步骤如下: //(1)首先定义Dice类。 //提示:Dice类表示一个骰子有faceValue一个属性,为整型; //有一个roll()方法和getFaceValue()。 //roll()方法功能使faceValue属性设置为1~6中的一个随机值,没有返回值。 //getFaceValue()方法功能为取出faceValue值。 //Math.random()方法是求随机数,返回值为double类型,值的范围为0.0~1.0 //(2)然后定义DiceGame类。 //提示:DiceGame类有dice1、dice2两个属性,类型分别为Dice类类型,有一个play()方法。 //play()方法返回一个布尔类型,true表示丢下两个骰子分值的总值为7点,否则为false。 //(3)最后编写一个测试类Test,对上面定义的类进行测试。 //提示: main()方法中产生DiceGame对象,执行play()方法后显示出输赢。 class Dice{ private int faceValue; public void roll(){ faceValue=(int)(6*Math.random()); } public int getFaceValue(){ return faceValue; } } class DiceGame extends Dice{ private Dice dice1; private Dice dice2; public boolean play(){ dice1.roll(); dice2.roll(); if(dice1.getFaceValue()+dice2.getFaceValue()==7){ System.out.println("赢了!"); return true; } else { System.out.println("输了!"); return false; } } } public class Test{ public static void main(String[] args){ DiceGame one=new DiceGame(); one.play(); } } 请问大神错在哪? 错在27和42行
Geotools 创建shape文件报错,无法设置中文属性
feature.setAttribute(0, polygon.getCode()); 这个属性名乱码,如果设置成中文就报错 eg: feature.setAttribute("图斑编码", polygon.getCode()); ``` package com.kero99.utils; /** * 创建shape文件 * @author ygc * */ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Serializable; import java.io.StringReader; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.geotools.data.FeatureWriter; import org.geotools.data.FileDataStore; import org.geotools.data.FileDataStoreFinder; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.data.shapefile.dbf.DbaseFileHeader; import org.geotools.data.shapefile.dbf.DbaseFileReader; import org.geotools.data.shapefile.files.ShpFiles; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.feature.type.Types; import org.geotools.geojson.feature.FeatureJSON; import org.geotools.geojson.geom.GeometryJSON; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.util.Converters; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; import com.kero99.patterns.IShape; import com.kero99.pojo.Zdesignpolygon; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.MultiPolygon; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /** * Geotools文档:http://docs.geotools.org/latest/javadocs/ * 创建shape文件 * @author ygc * */ public class createShapeFile { public static void main(String[] args) throws IOException { //创建文件路径 String path="C:\\新建文件夹\\y.shp"; File file=new File(path); //创建坐标 String str="{\"type\":\"MultiPolygon\",\"coordinates\":[[[[125.00088033726706,43.40147359017337],[124.99679348328742,43.401096616676305],[124.99694837503591,43.40186442431018],[124.99750584741349,43.401955866321565],[124.99803787708493,43.40230992248794],[124.9980525639301,43.40490599341744],[124.99939124766493,43.4039525077194],[124.999703712491,43.4048699875539],[124.99866141203354,43.40606649155232],[125.00126143620331,43.40562431171862],[125.00257777597052,43.403552077651824],[125.00295876012552,43.40274710316431],[125.00307123554897,43.40186767450569],[125.00088033726706,43.40147359017337]]]]}"; JSONObject jsonObject = JSONObject.fromObject(str); JSONArray jsonArray = jsonObject.getJSONArray("coordinates"); System.out.println(jsonArray); //创建对象添加属性信息 Zdesignpolygon polygon=new Zdesignpolygon(); polygon.setCode("106"); polygon.setCoordinate(str); polygon.setMark("tktt3"); polygon.setName("土坎梯田"); polygon.setState("坡耕地"); polygon.setNumber(12.64); polygon.setSlope(9.0); //添加创建的路径 Map<String, Serializable> params = new HashMap<String, Serializable>(); params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL()); ShapefileDataStoreFactory sf = new ShapefileDataStoreFactory(); //创建shape文件数据仓库根据工厂 ShapefileDataStore ds = (ShapefileDataStore) sf.createDataStore(file.toURI().toURL()); ds.setCharset(Charset.forName("GBK")); //ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createDataStore(params); //创建要素模板 SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder(); //设置wgs84格式 tb.setCRS(DefaultGeographicCRS.WGS84); //设置全局状态 tb.setName("shapefile"); //添加属性类型 tb.add("图斑编码", String.class); tb.add("措施代码", String.class); tb.add("措施名称", String.class); tb.add("利用现状", String.class); tb.add("措施数量", Double.class); tb.add("坡度", Double.class); tb.add("the_geom", MultiPolygon.class); //设置FeatureType数据存储。该方法将删除任何现有的本地资源或抛出IOException如果远程数据存储。 //这个元素附加源和附加Javadoc,因此没有能找到Javadoc。 ds.createSchema(tb.buildFeatureType()); //设置编码格式 //     类似的API FeatureReader后,调查组成员功能使用next()你可以叫删除()或修改后写()。 // 如果你不调用这两个方法调用之前hasNext(),或下(),这个功能将被修改的。 //   这个API允许修改,编写和基于过滤器的修改。请参阅ContentDataStore使用这个API实现共同opperations的例子。 // FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT); FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = ds.getFeatureWriter(ds.getTypeNames()[0], null); // FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = ds.getFeatureWriter(Transaction.AUTO_COMMIT); SimpleFeature feature = featureWriter.next(); // 取出特征里面的属性集合 //添加属性值和坐标 feature.setAttribute(0, polygon.getCode()); feature.setAttribute(1, polygon.getMark()); feature.setAttribute(2, polygon.getName()); feature.setAttribute(3, polygon.getState()); feature.setAttribute(4, polygon.getNumber()); feature.setAttribute(5, polygon.getSlope()); //转换geojson GeometryJSON geometryJSON2 = new GeometryJSON(15); Geometry geometry = geometryJSON2.read(new StringReader(polygon.getCoordinate())); feature.setAttribute("the_geom", geometry); featureWriter.write(); featureWriter.close(); ds.dispose(); } protected boolean validating; protected Map<String, String> index; protected SimpleFeatureType featureType; protected Object[] values; public SimpleFeatureType getFeatureType() { return this.featureType; } // public void setAttribute(String name, Object value) { // String idx = this.index.get(name); // if (idx == null) { // throw new IllegalAttributeException("Unknown attribute " + name); // } else { // this.setAttribute(idx, value); // } // } } ```
java.lang.StackOverflowError
用spring aop拦截参数,参数可能是对象,于是我重载了对象的tostring方法,用反射取出对象的属性值代码如下: public class BaseBean { /** * */ private static final long serialVersionUID = 1L; public String toString() { String s = ""; try { s = getPropertyString(this);//获取对象属性值 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return s; } public String getPropertyString(Object entityName) throws Exception { String methodname=null; Method method = null; Class c = entityName.getClass(); Field field[] = c.getDeclaredFields(); StringBuffer sb = new StringBuffer(); for (Field f : field) { if(!f.getName().equals("serialVersionUID" )){ methodname=f.getName().substring(0, 1).toUpperCase()+ f.getName().substring(1);//取得方法名称 method=c.getMethod("get"+methodname);//取得方法 sb.append(method.invoke(entityName));//调用方法并把得到的值相加 } } entityName=null; System.gc();//销毁对象 return sb.toString(); } 直接测试的时候没问题,测试代码: public class Test { public static void main(String[] args){ for(int i=0;i<10;i++){ User user=new User(); user.setUsername("yyy"); user.setAddress("zzz"); System.out.println(user.toString()); } } } 但是放在AOP中就出现java.lang.StackOverflowError异常,提示是Field field[] =c.getDeclaredFields();sb.append(method.invoke(entityName));这两行出错; 还有个奇怪的信息:at java.util.AbstractCollection.toString(Unknown Source) at org.hibernate.collection.PersistentSet.toString(PersistentSet.java:310) 不知道关hibernate什么事情,spring拦截代码如下: public void charcheck(JoinPoint joinpoint){ Object[] obj=joinpoint.getArgs(); System.out.println(obj[0].toString()); }
jsp中两个javascript,但是只能成功运行一个,单独都能正常运行。
一些css代码就省略了。两个js,单独都能正常使用,但是放在一起只有第二个js有反应,第一个没反映。 ``` <%@ page language="java" import="java.util.*,pojo.Consume,Dao.ConsumeDao" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>分类汇总</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link href="./css/doubleDate.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" language="javascript" src="./js/jquery-1.4.2.min.js" ></script> <script type="text/javascript" language="javascript" src="./js/doubleDate2.0.js" ></script> <script> $(function(){ $('.doubledate').kuiDate({ className:'doubledate', isDisabled: "0" // isDisabled为可选参数,“0”表示今日之前不可选,“1”标志今日之前可选 }); }); </script> <script type="text/javascript" language="javascript" src="./js/jquery-1.10.2.js"></script> <script> function alertWin(Cno) { /* $.ajax({ type:"post", url:"./ShowDetail", data:{Cno:Cno}, success:function(data){ alert("success"); } }); */ var msgw,msgh,titleheight,bordercolor,titlecolor; msgw = 300;//提示窗口的宽度 msgh = 300;//提示窗口的高度 titleheight = 25 //提示窗口标题高度 bordercolor = "#A480B2";//提示窗口的边框颜色 titlecolor = "#A480B2";//提示窗口的标题颜色 //根据自己需求注意宽度和高度的调整 var iWidth = document.documentElement. clientWidth; var iHeight = document.documentElement.clientHeight; //遮罩层 var bgObj = document.createElement("div"); bgObj.setAttribute("id", "bgObj");//设置ID bgObj.style.cssText = "position:absolute;left:0px;top:0px;width:"+iWidth+"px;height:"+Math.max(document.body.clientHeight, iHeight)+"px;filter:Alpha(Opacity=30);opacity:0.3;background-color:#000000;z-index:101;"; document.body.appendChild(bgObj); //弹出窗口 var msgObj=document.createElement("div"); msgObj.setAttribute("id", "msgDiv");//可以用bgObj.id="msgDiv"的方法,是为div指定属性值 msgObj.setAttribute("align", "center");//为div的align赋值 msgObj.style.background = "white";//背景颜色为白色 msgObj.style.border = "1px solid " + bordercolor;//边框属性,颜色在上面已经赋值 msgObj.style.position = "absolute";//绝对定位 msgObj.style.left = (iWidth-msgw)/2 ;//从左侧开始位置 msgObj.style.top = (iHeight-msgh)/2;//从上部开始位置 msgObj.style.font = "12px/1.6em Verdana, Geneva, Arial, Helvetica, sans-serif";//字体属性 msgObj.style.width = msgw + "px";//提示框的宽(上面定义过) msgObj.style.height = msgh + "px";//提示框的高(上面定义过) msgObj.style.textAlign = "center";//文本位置属性,居中。 msgObj.style.lineHeight = "25px";//行间距 msgObj.style.zIndex = "102";//层的z轴位置 document.body.appendChild(msgObj); //弹出窗口标题 var title = document.createElement("div");//创建一个标题对象 title.setAttribute("id", "msgTitle");//为标题对象填加id title.style.margin = "0";//浮动 title.style.padding = "3px";//浮动 title.style.background = titlecolor;//背景颜色 title.style.filter = "progid:DXImageTransform.Microsoft.Alpha(startX=20, startY=20, finishX=100, finishY=100,style=1,opacity=75,finishOpacity=100);"; title.style.opacity = "0.75";//透明 //title.style.border="1px solid " + bordercolor;//边框 title.style.height = "25px";//高度 title.style.font = "12px Verdana, Geneva, Arial, Helvetica, sans-serif";//字体属性 //title.style.color = "red";//文字颜色 title.style.cursor = "move";//鼠标样式 $.ajax({ type:"post", url:"ShowDetail?Cno="+Cno, dataType:"json", success:function(data){ },error:function(){ alert("请求出错"); }}); title.innerHTML="<table border='0' width='100%'><tr><td align='center'>收银小票单</td><td align=\"right\"><a href='#' onclick='closeDiv()'>关闭</a></td></tr><tr><td align='center'>时间:</td></tr><tr><td align='left'>三得利青柠水</td></tr></table>"; msgObj.appendChild(title);//在提示框中增加标题 } //添加关闭功能 function closeDiv() { var msgTitelObject = document.getElementById("msgDiv"); document.body.removeChild(msgTitelObject); var bgObj = document.getElementById("bgObj"); document.body.removeChild(bgObj); } </script> </head> <body> <ul class="iptgroup"> <li>开始日期:</li> <li><input type="text" readonly="readonly" class="doubledate ipticon"/></li> <li style="width:20px;"></li> <li>结束日期:</li> <li><input type="text" readonly="readonly" class="doubledate ipticon"/></li> </ul> <form action="FF" method="get" name="myform" id="myform"> <div class="upleft"><img src="image/tu4.gif" width="130" height="130" border="0" /></div> <div class="upright"><br><br><br><center><font face="楷体"color="#000000" size=5><strong>您的消费账单:</strong></font></center></div> <div class="center"> ……………………………………………………………………………… </table> </div> </form> </body> </html> ```
文件无法写入!还有NullPointerException的问题
(1) 设计一个复数运算接口OperatorListener,定义抽象方法Complex add(Complex z) (2) 设计一个复数类Complex,此复数类实现OperatorListener接口,该类定义 私有属性:实部,虚部 方法:返回此复数的详细信息String toString(),输出格式例如3+4i 实现接口里的Complex add(Complex stu)抽象方法,实现复数的相加 构造方法:有参构造方法初始化成员变量 (3) 设计测试类Test,主函数要求产生两个复数对象,对象的成员变量值来自命令行参数,调用add方法,实现两个复数的相加,把相加的结果值写入到c:/ComputeInfo.txt文件中,并处理所有的异常信息。 自己写的源代码: (1) public interface OperatorListener{ public Complex add(Complex z); } (2) public class Complex implements OperatorListener{ private double real; private double imag; public Complex(){ } public Complex(double real,double imag){ this.real=real; this.imag=imag; } public Complex(Complex c){ real=c.real; imag=c.imag; } public double getReal(){ return real; } public double getImag(){ return imag; } public String toString(){ System.out.println(real+"+"+imag+"i"); return null; } public Complex add(Complex stu){ Complex p=new Complex(); p.real=real+stu.getReal(); p.imag=imag+stu.getImag(); return p; } } (3) import java.io.*; public class Test { public static void main(String[] args){ // TODO 自动生成的方法存根 try{ double x1,y1; double x2,y2; x1=Double.parseDouble(args[0]); y1=Double.parseDouble(args[1]); x2=Double.parseDouble(args[2]); y2=Double.parseDouble(args[3]); Complex com1=new Complex(x1,y1); Complex com2=new Complex(x2,y2); Complex com=com1.add(com2); File f=new File("C:\\ComputeInfo.txt"); FileOutputStream file=new FileOutputStream(f,true); file.write(com.toString().getBytes("utf-8")); file.close(); } catch(ArrayIndexOutOfBoundsException e){ System.out.println("你还没有输入呢,请输入数值!"); } catch(NumberFormatException e){ System.out.println("你输入的是字符,请输入数值!"); } catch(IOException e){ System.out.println("写入文件不成功!"); } } } 在eclipse上可以显示结果,但是下面多出了两行: Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:16) 问题出在了file.write(com.toString().getBytes("utf-8")); 这一行 也无法写入到指定文件,想求教下这一行怎么改?
Struts2 OGNL表达式访问普通类的构造方法取不出值
ognl.jsp代码 ``` <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>OGNL</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> Ognl Page!<br/> <ol> <li>访问值栈中的普通属性 取出username:<s:property value="username"/></li> <li>访问值栈中的普通属性 取出password:<s:property value="password"/></li> <li>访问值栈中的对象的属性 取出user.Age:<s:property value="user.age"/></li> <li>访问值栈中的对象的属性 取出cat.dog.name:<s:property value="cat.dog.name"/></li> <li>访问值栈中的成员变量的普通方法 取出password的长度:<s:property value="password.length()"/></li> <li>访问值栈中的对象的普通方法 取出cat.miaomiao:<s:property value="cat.miaomiao()"/></li> <li>访问值栈中的action的普通方法 取出helloaction:<s:property value="helloaction()"/></li> </ol> <hr> <ol> <li>访问静态成员:<s:property value="@com.mytest.ognl.S@staticStr"/></li> <li>访问静态方法:<s:property value="@com.mytest.ognl.S@StaticMethord()"/></li> <!-- 静态方法的访问应该在配置struts.xml中配置 <constant name="struts.ognl.allowStaticMethodAccess" value="true"/> 默认的default.properties中属性值是false --> <li>访问Math类的方法:<s:property value="@@max(2,9)"/></li> <!-- 访问Math类的方法时候用两个@@符号,只限于访问Math类 --> </ol> <hr> <ol> <li>访问普通类的构造方法:<s:property value="new com.mytest.ognl.User(8)"/></li> </ol> <hr> <ol> <li></li> </ol> <s:debug></s:debug> </body> </html> ``` User.java代码 ``` package com.mytest.ognl; public class User { private int Age; public User(){} public User(int Age){ super(); this.Age=Age; } public void setAge(int age) { Age = age; } public int getAge() { return Age; } public String toString(){ return "user" + Age; } } ``` 执行结果: ![图片说明](https://img-ask.csdn.net/upload/201607/18/1468808591_928039.jpg) 访问普通类的构造方法:那个地方的值总是取不出来?怎么回事呀?求大神帮忙给解决下。
hibernate 延迟加载异常(无法获取lazy对象)
我在jpa中有两个对象:hospitalization与patient,两个对象之间是多对一双向关联,全部都加上lazy 然后在查询的时候使用left join fetch 来加载patient service如下: [code="java"] try{ String sql="select h from Hospitalization as h left join fetch h.patient where h.code=?1"; Query query=entityManager.createQuery(sql); query.setParameter(1, code); return (Hospitalization) query.getSingleResult(); }catch(Exception e){ e.printStackTrace(); return null; } [/code] 这样返回的hospitalization这个对象无法获取patient这个属性,报no session异常: [code="java"] 2010-03-24 10:40:22,343 [main] ERROR org.hibernate.LazyInitializationException:19 - could not initialize proxy - no Session org.hibernate.LazyInitializationException: could not initialize proxy - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:166) [/code] 如果我在service上面用 [code="java"] Hospitalization h=(Hospitalization) query.getSingleResult(); // System.out.println(h.getPatient().getPatientName()); return h; [/code] 这样来写可以get到,但是这样hibernate又从数据库查询了一次,明明在调用left join fetch 这个sql的时候已经搜索出来了patient值(在sqlserver上面执行可以看到)但是他却不会组装成对象关联,返回给client的时候数据就又丢失了,请问这样的问题该怎么解决,这种情况只有个别类会遇到,完全一样的写法有些类就没问题
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Android性能优化(4):UI渲染机制以及优化
文章目录1. 渲染机制分析1.1 渲染机制1.2 卡顿现象1.3 内存抖动2. 渲染优化方式2.1 过度绘制优化2.1.1 Show GPU overdraw2.1.2 Profile GPU Rendering2.2 卡顿优化2.2.1 SysTrace2.2.2 TraceView 在从Android 6.0源码的角度剖析View的绘制原理一文中,我们了解到View的绘制流程有三个步骤,即m...
微服务中的Kafka与Micronaut
今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务。我们使用Micronaut框架,它为与Kafka集成提供专门的库。让我们简要介绍一下示例系统的体系结构。我们有四个微型服务:订单服务,行程服务,司机服务和乘客服务。这些应用程序的实现非常简单。它们都有内存存储,并连接到同一个Kafka实例。 我们系统的主要目标是为客户安排行程。订单服务应用程序还充当网关。它接收来自客户的请求...
致 Python 初学者们!
作者| 许向武 责编 | 屠敏 出品 | CSDN 博客 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 Python 这门编程语言,从2009年开始单一使用 Python 应对所有的开发工作,直至今...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
SpringBoot2.x系列教程(三十六)SpringBoot之Tomcat配置
Spring Boot默认内嵌的Tomcat为Servlet容器,关于Tomcat的所有属性都在ServerProperties配置类中。同时,也可以实现一些接口来自定义内嵌Servlet容器和内嵌Tomcat等的配置。 关于此配置,网络上有大量的资料,但都是基于SpringBoot1.5.x版本,并不适合当前最新版本。本文将带大家了解一下最新版本的使用。 ServerProperties的部分源...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
爬取薅羊毛网站百度云资源
这是疫情期间无聊做的爬虫, 去获取暂时用不上的教程 import threading import time import pandas as pd import requests import re from threading import Thread, Lock # import urllib.request as request # req=urllib.request.Requ...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
HTML5适合的情人节礼物有纪念日期功能
前言 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字段也可自行修改,还有代码下半部分的JS代码需要修改一下起始日期 注意月份为0~11月 也就是月份需要减一。 当然只有一部分HTML和JS代码不够运行的,文章最下面还附加了完整代码的下载地址 &lt;!...
相关热词 c# 数组类型 泛型约束 c#的赛狗日程序 c# 传递数组 可变参数 c# 生成存储过程 c# list 补集 c#获得所有窗体 c# 当前秒数转成年月日 c#中的枚举 c# 计算校验和 连续随机数不重复c#
立即提问