Java第一次创建对象速度会慢于之后的创建

我在创建一个对象时发现第一次new出的对象会耗时比较长,而后面的创建则会很快速,请问大神这是为什么?
代码如下:

  public static void main(String[] args) throws InterruptedException {
    for(int i =0;i<5;i++){
        long now = System.currentTimeMillis();
        RestTemplate httpClient = new RestTemplate();
        System.out.println(System.currentTimeMillis() - now);
    }
}

输出结果如下:

 1084
16
7
12
5

感谢大神回答!

3个回答

类的对象在第一次创建的时候,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

所以同一个类创建第二个对象的时候就不再需要加载类对象,而是直接实例化,这样后面创建的时间就短了

rc447516551
rc447516551 我在一个web应用中使用javax.ws.rs.client.Client client = javax.ws.rs.client.ClientBuilder.newClient();通讯,发生了第一次请求创建速度很慢,如果第二次紧跟第一次的话,那么速度也会很快,如果过一会之后(一分钟)又会变得很慢了,为什么隔一小段时间后又会变慢呢?不是在第一次创建对象的时候已经加载了吗?
接近 3 年之前 回复

因为java字节码的编译,静态类型的初始化等等都在首次加载发生,而之后不需要,所以第一次加载慢。

rc447516551
rc447516551 我在一个web应用中使用javax.ws.rs.client.Client client = javax.ws.rs.client.ClientBuilder.newClient();通讯,发生了第一次请求创建速度很慢,如果第二次紧跟第一次的话,那么速度也会很快,如果过一会之后(一分钟)又会变得很慢了,为什么隔一小段时间后又会变慢呢?不是在第一次创建对象的时候已经加载了吗?
接近 3 年之前 回复

在第一次new对象时,需要把对应的类load到内存,还要为静态变量分配存储空间,所以会慢一些。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
# java字符串二维数组创建对象个数的问题
在java中运行这一句代码: String[][] str = new String[3][4]; 假设是第一次运行,在内存中会产生多少个对象?请说明理由,不要说一个单纯的数字.谢谢.
Java中的递归方法,是那个对象调用的
当递归方法在其他类中的时候,需要创建该类对象才能调用这个递归方法,那么递归调用自己的时候,需不需要写,this。我发现不写也没什么问题,可是当这个方法第二次调用的时候是那个对象调用的呢 ,还是第一次那个调用递归方法的对象吗,
java 代理对象 在加入list以后变回了非代理对象,是正常现象么?怎么处理。
本人小白,在学习数据库连接池实现时,为了确保调用者在获取了Connection后,不要直接close。使用动态代理方式创建代理对象,重新处理close函数。在执行中发现,用户在释放了代理对象以后,连接在add进list以后,变回了非代理的ConnectionImpl对象,导致再次取出时,代理作用丢失,请各位帮忙分析一下是怎么回事? ``` import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.util.LinkedList; public class DBPool { private int maxSize;//最大连接数 private int initSize;//初始化连接数 private int cur = 0;//已经使用的连接数 private LinkedList<Connection> pool = new LinkedList<Connection>(); //初始化连接池 public DBPool(int initSize, int maxSize) { this.maxSize = maxSize; this.initSize = initSize; initPool(initSize); } @Override public String toString() { return "DBPool [pool=" + pool + "]"; } //得到正在使用的连接个数 public int getCur() { return cur; } //连接池中连接个数 public int getPoolSize() { return pool.size(); } //初始化连接池方法 public void initPool(int initSize) { for (int i = 0; i < initSize; i++) { pool.add(createConnection()); } } //提供给调用者一个连接 public Connection getPoolConnection() { if (pool.size() > 0) { cur++; return pool.removeFirst(); } else if (cur >= maxSize) { System.out.println("连接已达到最大值"); return null; } else { cur++; return createConnection(); } } public Connection createConnection() { //使用工具类获取数据库连接 Connection con = MysqlUtils.getConnection(); //创建代理对象,代理con的close方法,如果连接池不满,就放入连接池,如果连接池满,则调用原close方法。 Connection proxy = (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(), new Class[]{Connection.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; //判断是否close方法 if ("close".equals(method.getName())) { // 如果连接池里面连接数<initSize,则直接加入pool if (pool.size() < initSize) { cur--; pool.addLast(con); } else {// 如果连接池>initSize,则直接关闭。 cur--; result = method.invoke(con, args); } //如果不是close方法,则直接调用原函数 } else { result = method.invoke(con, args); } return result; } }); return proxy; } } ``` 测试方法如下: @Test public void testPool() throws SQLException { //初始化连接池,池大小1,最大连接数2 DBPool pool=new DBPool(1, 2); //获取2个连接 Connection[] conn=new Connection[2]; for(int i=0;i<conn.length;i++) { conn[i]=pool.getPoolConnection(); } //释放两个连接,按照代理处理结果,应该是一个放回连接池,一个关闭。 for(int i=0;i<conn.length;i++) { if(conn[i]!=null) { conn[i].close(); conn[i]=null; } } //再次获取2个连接 for(int i=0;i<conn.length;i++) { conn[i]=pool.getPoolConnection(); } //再次释放2个连接 for(int i=0;i<conn.length;i++) { if(conn[i]!=null) { conn[i].close(); conn[i]=null; } } //预期结果应该是当前使用连接cur=0,池中连接数为1. System.out.println("当前使用的连接数:"+pool.getCur()+",当前连接池中连接数:"+pool.getPoolSize()); } 执行后结果如下: 当前使用的连接数:1,当前连接池中连接数:1 ``` 当前结果与预期结果不一致。 经过调试发现: 1、初始化完毕时,链表内容为: pool LinkedList<E> (id=299) [0] $Proxy4 (id=313) 2、第一次获取getPoolConnection(),conn数组内容为: conn Connection[2] (id=322) [0] $Proxy4 (id=307) [1] $Proxy4 (id=331) 3、第一次放回池中,pool链表内容为和conn数组分别为: pool LinkedList<E> (id=293) [0] ConnectionImpl (id=316) conn Connection[2] (id=322) [0] null [1] null 4、 第二次获取getPoolConnection(),conn数组内容为: conn Connection[2] (id=322) [0] ConnectionImpl (id=316) [1] $Proxy4 (id=491) 同时,在调试时也确实在第二次close两个连接时,conn[0].close没有执行代理程序。 不好意思,没有C币,请大家多包涵。
关于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的地址与我的三个对象地址完全不一样,那些地址是谁的?另外那四个我标注的看地址本应该不存在的地址对应的对象是怎么出来的?哪位大神能帮我说明一下,另外那四个对象是怎么来的?
关于alibaba.json.TypeReference的使用以及创建对象的时候为什么要加大括号?
当我使用这段代码时,会编译报错: row1 : String a = "[{\"\":62},{\"[0,1]\":97},{\"(1,2]\":92},{\"(2,3]\":79},{\"(3,+∞]\":57}]"; row2 : List<HashMap> hashMaps = JSON.parseObject(a, new TypeReference<List<HashMap>>(){}); 当我把row2换成 : List<HashMap> hashMaps = JSON.parseObject(a, new TypeReference<List<HashMap>>(){}); 即TypeReference后面加大括号就不会报错了; 这是为什么阿?为什么会编译时就报错呢?不是很理解。在我看来TypeReference就是一个普通类,传递对象时后面还要加大括号,表示其子类,第一次见这种用法?编译即报错是怎么做到的呢? 求大神告知原因,谢谢
Java要怎么才能返回判断开始的地方呢?
![图片说明](https://img-ask.csdn.net/upload/201908/01/1564665399_180558.png) (qwq)百度了一下都没有类似的问题和答案,我试着创建了一个对象来调用判断用的choice方法,然后返回那个对象,但是仍然不能进行第二次判断,请问要怎么做才可以呢? 我太菜了,请大哥们嘴下留情 后面我将代码修改成了这样 ![图片说明](https://img-ask.csdn.net/upload/201908/02/1564710191_790496.jpg) 结果输入暗号和名字以外的内容后会一直循环输出 System.out.println("抱歉这位阁下,在这里麻烦您遵守一下我的规则吧?(微笑)"); 这个命令,是为什么呢 _(:зゝ∠)_ 懂了我这个臭弟弟把Scanner放到循环外了,导致不能输入第二次判断的decide,循环时decide的值仍然是第一次输入的值,难怪会一直输出报错信息
springboot 配置hibernate 开始使用的是mysql,都正常,但是换成Oracle后总是创建表。
springboot 配置hibernate 开始使用的是mysql,都正常,但是换成Oracle后总是创建表。所以后台报如下表重复错误。这是为什么呀?应该是如果发现表已经有的话不应该再创建才对,请帮我看下哪里配置错了。 再详细说明下我的场景: 数据库映射的对象Product。 第一次系统启动肯定会创建一个,因为数据库中是没有这个表,然后系统重启或者再次启动,正常来讲,Product对象没有改过,数据库表也存在,hibernate不应该再创建,但是目前就是再创建,所以报表名已经有的错误。 ``` Caused by: java.sql.SQLSyntaxErrorException: ORA-00955: 名称已由现有对象使用 at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) ~[ojdbc-6.6.0.jar:11.2.0.4.0] at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) ~[ojdbc-6.6.0.jar:11.2.0.4.0] at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) ~[ojdbc-6.6.0.jar:11.2.0.4.0] ``` ``` server: port: 8001 spring: application: name: DEMO_TEST #f服务名称定义 datasource: type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 #driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包 driver-class-name: oracle.jdbc.driver.OracleDriver #url: jdbc:mysql://127.0.0.1:3306/rd_plm?serverTimezone=GMT%2B8 # 数据库名称 url: jdbc:oracle:thin:@127.0.0.1:1521/DD username: root password: root dbcp2: min-idle: 5 # 数据库连接池的最小维持连接数 initial-size: 5 # 初始化连接数 max-total: 5 # 最大连接数 max-wait-millis: 150 # 等待连接获取的最大超时时间 jpa: hibernate: naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl ddl-auto: update show-sql: true properties: hibernate: #dialect: org.hibernate.dialect.MariaDBDialect dialect: org.hibernate.dialect.OracleDialect current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext #database: MYSQL database: oracle open-in-view: true ```
为什么我做的登录页面的验证码,第一次总是加载不出来,要点击刷新才行?
![图片说明](https://img-ask.csdn.net/upload/201912/16/1576481218_121713.png) ![图片说明](https://img-ask.csdn.net/upload/201912/16/1576481226_828744.png) ![图片说明](https://img-ask.csdn.net/upload/201912/16/1576481234_406433.png) ++++++++++++++++++++++++++++++++++++++++++++++ <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <script> <%-- 当窗口加载完毕 --%> window.onload = function (ev) { document.getElementById("img").onclick = function (ev1) { this.src = "./checkCodeServlet?time="+new Date().getTime(); } } </script> <form action="./loginServlet"> <table> <tr> <td>账号</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password"></td> </tr> <tr> <td>验证码</td> <td><input type="text" name="checkCode"></td> </tr> <tr> <td colspan="2"><img id="img" src="com.test.pro.CheckCodeServlet"></td> </tr> <tr> <td>提交</td> <td colspan="2"><input type="submit" value="登录"></td> </tr> <tr> <td></td> <td></td> </tr> </table> </form> <div><%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error") %></div> <div><%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error")%></div> </body> </html> ++++++++++++++++++++++++++++++++++++++++++++++ @WebServlet("/checkCodeServlet") public class CheckCodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int width = 100; int height = 50; //1.创建一对象,在内存中图片(验证码图片对象) BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //2.美化图片 //2.1 填充背景色 Graphics g = image.getGraphics();//画笔对象 g.setColor(Color.PINK);//设置画笔颜色 g.fillRect(0,0,width,height); //2.2画边框 g.setColor(Color.BLUE); g.drawRect(0,0,width - 1,height - 1); String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789"; //生成随机角标 Random ran = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 4; i++) { int index = ran.nextInt(str.length()); //获取字符 char ch = str.charAt(index);//随机字符 // 把生成的验证码存进sb sb.append(ch); //2.3写验证码 g.drawString(ch+"",width/5*i,height/2); } // 转换sb的格式? String checkCode_session = sb.toString(); //将验证码存入session request.getSession().setAttribute("checkCode_session",checkCode_session); //2.4画干扰线 g.setColor(Color.GREEN); //随机生成坐标点 for (int i = 0; i < 10; i++) { int x1 = ran.nextInt(width); int x2 = ran.nextInt(width); int y1 = ran.nextInt(height); int y2 = ran.nextInt(height); g.drawLine(x1,y1,x2,y2); } //3.将图片输出到页面展示 ImageIO.write(image,"jpg",response.getOutputStream()); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
困惑:JAVA部署到WINDOWS运行比JAVA快?
我用MINA框架写了一个SOCKET通讯服务器,部署到WINDOWS上运行,响应一个客户的请求大概是1秒,而在LINUX ENTERPRISE 4上是3秒-5秒。 这是为什么呢?是不是什么地方没配置好,请教各位大侠,谢谢! 用的都是SUN 的 JDK1.6 [b]问题补充:[/b] 我用MINA框架写了一个SOCKET通讯服务器,部署到WINDOWS上运行,响应一个客户的请求大概是1秒,而在LINUX ENTERPRISE 4上是3秒-5秒。 这是为什么呢?是不是什么地方没配置好,请教各位大侠,谢谢! 用的都是SUN 的 JDK1.6 [b]问题补充:[/b] 我用LOG4J记录日志跟踪了下。 模拟的情况是这样的:一台机子发送一个socket请求到服务器上(重复做3次) 结果观察到所耗费的时间区别就是在我程序中的一个类(由AIXS2生产的访问webservice代理对象)的创建中(new) windows服务器 创建这个对象的时间如下:第一次 700-800ms 第二次60ms 第三次30ms LINUX服务器 每次都要2m左右 程序中其他模块所消耗的时间基本相同,没太大区别(其他模块也基本没什么对象生成) 难道WINDOWS上NEW一个java对象速度比LINUX上真快? [b]问题补充:[/b] 想起一个问题 我windows上是用myeclipse启动跑的 而LINUX上是在WINDOWS上通过myclipse打包成jar部署的(因为比较懒,把MINA和AXIS中所有的JAR包全部引入了)。 会不会是因为这个导致慢? 打包JAR时,如果工程引用了过多的多余JAR是不是会影响效率? 初次写JAVA,请多帮助 [b]问题补充:[/b] 晕,我发现问题了,既然没想到JAR会影响效率 我WINDOWS上是用ECLIPSE运行的 LINUX上运行打包后的JAR。 我将WINDOWS上的变成JAR后,效率就基本相同了,感觉LINUX要更快一点(也许是机子配置的细微差别) JAR为什么打包会影响效率,打包是不是有什么地方要注意(我是用MYECLIPSE7.0自带的RUNJAR(好像拼写错了)向导打包的) [b]问题补充:[/b] 问题解决了,谢谢解答的兄弟们,罪魁祸首就是JAR打包造成得 我使用MYECLIPSE7.0M2自带得打包向导(runnalbejar,好像又拼错了)打包成JAR得,打包后他把所有程序中用到得第三方类库全部打进去了。 我仔细看了下打包后得JAR里有很多多余得配置文件和一些类包, 我就尝试得删除了多余得配置文件和一些多余得类包(类包应该不是问题,问题应该是多余得配置文件),然后无论是不打包就这样运行,还是再打包JAR运行,都不存在效率问题,速度运行都很快了~ 补充说明:给我感觉还是LINUX比windows快,后面这样搞就好了 另外我还有一个问题,是不是MYECLIPSE那个自带打包程序有时不够智能,存在问题,你们平时都是怎么打包得,用什么工具? (我得要求是打包成JAR就可以,程序中用到了很多第三方类库) 备注:我这个程序是个SOCKET程序,不是什么J2EE,没有用到WEB容器,就直接用JVM跑得 再保留两天,两天后结贴,先谢谢楼上得各位大侠~
mybatis两次执行相同查询语句之间使用更新操作(未提交数据),查询到的数据不一致的问题
问题: 比较情况二与情况三,第二次查询的结果是一样的,可是情况二未更新数据库的数据,情况三更新了数据库的数据。 mybatis两次执行相同查询语句之间使用了更新操作,但是未进行数据提交,可是第二次查询的结果是更新之后的数据,为什么呢? # mybatis的一级缓存的测试示例 ## 一、情况一: 1.执行代码: ``` //一级缓存测试 @Test public void testCache1() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //创建代理对象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //下边查询使用一个SqlSession //第一次发起请求,查询id为1的用户 User user1=userMapper.findUserById(1); System.out.println(user1); //第二次发起请求,查询id为1的用户 User user2=userMapper.findUserById(1); System.out.println(user2); sqlSession.close(); } ``` 2.运行结果: ![图片说明](https://img-ask.csdn.net/upload/201909/02/1567399738_124569.png) ## 二、情况二 1.执行代码: ``` //一级缓存测试 @Test public void testCache1() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //创建代理对象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //下边查询使用一个SqlSession //第一次发起请求,查询id为1的用户 User user1=userMapper.findUserById(1); System.out.println(user1); //更新user1的信息 user1.setUsername("你好"); userMapper.updateUser(user1); //第二次发起请求,查询id为1的用户 User user2=userMapper.findUserById(1); System.out.println(user2); sqlSession.close(); } ``` 2.运行结果: ![图片说明](https://img-ask.csdn.net/upload/201909/02/1567400121_90209.png) 三、情况三 1.执行代码: ``` @Test public void testCache1() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //创建代理对象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //下边查询使用一个SqlSession //第一次发起请求,查询id为1的用户 User user1=userMapper.findUserById(1); System.out.println(user1); /*若sqlSession去执行commit操作(执行插入、更新、删除),则清空SqlSession中的一级缓存, 这样做的目的为了让缓存中存储的是最新的信息,避免脏读。*/ //更新user1的信息 user1.setUsername("你好"); userMapper.updateUser(user1); //执行commit操作去清空缓存 sqlSession.commit(); //第二次发起请求,查询id为1的用户 User user2=userMapper.findUserById(1); System.out.println(user2); sqlSession.close(); } ``` 2.运行结果: ![图片说明](https://img-ask.csdn.net/upload/201909/02/1567400456_254023.png)
Java Web连接MySql数据库,修改数据库连接类中的用户名和密码没有效果?
现在在做一个项目,其中编写了数据库连接及操作的类。 1、ConnDB类。 package com.wgh.tools; import java.io.InputStream; //导入java.io.InputStream类 import java.sql.*; //导入java.sql包中的所有类 import java.util.Properties; //导入java.util.Properties类 public class ConnDB { public Connection conn = null; // 声明Connection对象的实例 public Statement stmt = null; // 声明Statement对象的实例 public ResultSet rs = null; // 声明ResultSet对象的实例 //private static String propFileName = "connDB.properties"; // 指定资源文件保存的位置 //private static Properties prop = new Properties(); // 创建并实例化Properties对象的实例 private static String dbClassName = "com.mysql.jdbc.Driver"; // 定义保存数据库驱动的变量 private static String dbUrl = "jdbc:mysql://127.0.0.1:3306/db_9griddiary?user=root&password=&useUnicode=true&characterEncoding=utf8"; // public ConnDB() { // 构造方法 // try { // 捕捉异常 // // 将Properties文件读取到InputStream对象中 // InputStream in = getClass().getResourceAsStream(propFileName); // prop.load(in); // 通过输入流对象加载Properties文件 // dbClassName = prop.getProperty("DB_CLASS_NAME"); // 获取数据库驱动 // // 获取连接的URL // dbUrl = prop.getProperty("DB_URL", dbUrl); // } catch (Exception e) { // e.printStackTrace(); // 输出异常信息 // } // } /** * 功能:获取连接的语句 * * @return */ public static Connection getConnection() { Connection conn = null; try { // 连接数据库时可能发生异常因此需要捕捉该异常 Class.forName(dbClassName).newInstance(); // 装载数据库驱动 conn = DriverManager.getConnection(dbUrl); // 建立与数据库URL中定义的数据库的连接 } catch (Exception ee) { ee.printStackTrace(); // 输出异常信息 } if (conn == null) { System.err .println("警告: DbConnectionManager.getConnection() 获得数据库链接失败.\r\n\r\n链接类型:" + dbClassName + "\r\n链接位置:" + dbUrl); // 在控制台上输出提示信息 } return conn; // 返回数据库连接对象 } /* * 功能:执行查询语句 */ public ResultSet executeQuery(String sql) { try { // 捕捉异常 conn = getConnection(); // 调用getConnection()方法构造Connection对象的一个实例conn stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery(sql); } catch (SQLException ex) { System.err.println(ex.getMessage()); // 输出异常信息 } return rs; // 返回结果集对象 } /* * 功能:执行更新操作 */ public int executeUpdate(String sql) { int result = 0; // 定义保存返回值的变量 try { // 捕捉异常 conn = getConnection(); // 调用getConnection()方法构造Connection对象的一个实例conn stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); result = stmt.executeUpdate(sql); // 执行更新操作 } catch (SQLException ex) { result = 0; // 将保存返回值的变量赋值为0 } return result; // 返回保存返回值的变量 } /* * 功能:关闭数据库的连接 */ public void close() { try { // 捕捉异常 if (rs != null) { // 当ResultSet对象的实例rs不为空时 rs.close(); // 关闭ResultSet对象 } if (stmt != null) { // 当Statement对象的实例stmt不为空时 stmt.close(); // 关闭Statement对象 } if (conn != null) { // 当Connection对象的实例conn不为空时 conn.close(); // 关闭Connection对象 } } catch (Exception e) { e.printStackTrace(System.err); // 输出异常信息 } } } 第一次连接成功。 第二次为什么无论把这个类中的用户名和密码修改成什么都能连接上MySql了? 请问这个类中的用户名和密码有用吗? 那在哪儿修改用户名和密码后就连接不上Mysql了?
关于java中加载和初始化的疑问?各位帮忙分析下
public class ExA { private static ExA a = new ExA(); static { System.out.println("父类--静态代码块"); } public ExA() { System.out.println("父类--构造函数"); } { System.out.println("父类--非静态代码块"); } public static void main(String[] args) { new ExB(); } } 程序执行时先找到程序入口即main函数,接着加载和初始化main函数所在的类即ExA,那么第一句就是private static ExA a = new ExA();那么执行这句代码的时候发生了什么?我知道的是先把a设置为null,然后才去赋值为new ExA();关键是new ExA()(第一次创建对象)的时候按道理不是会触发ExA类的加载和初始化吗?但这句代码就在ExA类初始化的第一行,难道要跳过去初始化static { System.out.println("父类--静态代码块"); }吗?还是有别的理解? 第二个疑问:是不是当要首次创建一个类的对象时,前提条件是这个类必须先加载和初始化都完成后才能首次创建类的对象?还是说只要这个类加载了虽然没有初始化就可以创建类的对象了? class ExB extends ExA { private static ExB b = new ExB(); static { System.out.println("子类--静态代码块"); } { System.out.println("子类--非静态代码块"); } public ExB() { System.out.println("子类--构造函数"); } }
java关于TreeSet集合的问题,为什么每次添加只能添加进去一个,再添加的时候就会覆盖掉前面那个
不知道为什么只能添加一个对象进去,添加第二次的时候就覆盖掉了第一次添加进去的。麻烦大家了! 这是main方法 if("a".equalsIgnoreCase(option)){ //查看图书的功能 d.cheekBook(); } else if("b".equalsIgnoreCase(option)){ //添加图书的功能 System.out.println("请输入书名:"); bookName=sc.next(); System.out.println("请输入作者:"); author=sc.next(); System.out.println("请输入出版社:"); press=sc.next(); System.out.println("请输入价格:"); price=sc.next(); System.out.println("请输入书号:"); bookID=sc.next(); System.out.println("请输入出版日期:"); pubdate=sc.next(); boolean bl2=d.addBook(bookName,author,press,price,bookID,pubdate); if(bl2){ System.out.println("添加成功"); System.out.println("请选择功能:查看图书(A) 添加图书(B) 修改图书(C) 删除图书(D)"); option=sc.next(); if("a".equalsIgnoreCase(option)){ //查看图书 d.cheekBook(); } else if("b".equalsIgnoreCase(option)){ //添加图书 System.out.println("请输入书名:"); bookName=sc.next(); System.out.println("请输入作者:"); author=sc.next(); System.out.println("请输入出版社:"); press=sc.next(); System.out.println("请输入价格:"); price=sc.next(); System.out.println("请输入书号:"); bookID=sc.next(); System.out.println("请输入出版日期:"); pubdate=sc.next(); bln=d.addBook(bookName,author,press,price,bookID,pubdate); if(bln){ System.out.println("添加成功"); } } 这是添加图书和查看图书的的方法 //创建book对象 Book book=new Book(); //创建TreeSet集合,里面储存book对象的属性 TreeSet<Book> tree=new TreeSet<Book>(); //查看图书的功能 public void cheekBook(){ if(tree.isEmpty()){ System.out.println("请添加图书!!!"); } else{ System.out.println("查看图书"); System.out.println("|书名| |作者| |出版社| |价格| |书号| |出版日期|"); Iterator<Book> it=tree.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } //添加图书 public boolean addBook(String bookName, String author, String press, String price, String bookID, String pubdate){ boolean bl2=false; book.setBookName(bookName); book.setAuthor(author); book.setPress(press); book.setPrice(price); book.setBookID(bookID); book.setPubdate(pubdate); System.out.println("新书信息如下:"+book.toStrings()); System.out.println("是否保存该书? (Y)是 (N)否"); option=sc.next(); if("y".equalsIgnoreCase(option)){ System.out.println("正在添加...."); tree.add(book);//把图书的信息添加到tree集合中 bl2=true; } else{ System.out.println("已取消"); } return bl2; }
dom4j中因为输出流未正确关闭,导致再次获取单例模式的document时,对象为null
一:如下是获取单例模式的document对象。 ``` private static Document returndoc(Document docuname, String xmlname) { if (docuname != null) { return docuname; } SAXReader reader = new SAXReader(); // 如果不存在就创建对象。 try { docuname = reader.read(XMLUtil.class.getClassLoader() .getResourceAsStream("xml/" + xmlname + ".xml")); return docuname; } catch (DocumentException e) { e.printStackTrace(); } return null; } ``` 二、在这写入代码里,out被我赋值了两次,我想实现同时写入到bin和src。 其中第一次建立的流应该算是没有正常关闭??当out第二次赋值后,依旧成功的将documen写入到xml中。之后出现的问题就是:当我在Dao中再次调用第一段代码需要得到docunment时,竟得不到之前已经创建好的单例docunment对象(之前创建好的document变为null),而是让我再次创建,并且报出异常。 经过多次调试修改,发现,就是write2XML方法中第一次out我没有关闭导致的。但是我分析不清这是为什么,求指导。 ``` public static void write2XML(Document d, String name) { XMLWriter out = null; try { String path = XMLUtil.class.getClassLoader() .getResource("xml/" + name + ".xml").getPath(); // System.out.println(path);//路径上不要出现空格。 // src中的文件都会被编译或复制一份到bin目录下,所以src下文件改动,bin下的文件也会跟着自动改动。反正不成立。所以我们需要在学习阶段把得到 // 的bin目录换成src目录。 out = new XMLWriter(new FileWriter(path),//未关闭的输出流 OutputFormat.createPrettyPrint()); out.write(d); // 写入到src目录下的被copy的xml //out.close(); path = path.replace("bin", "src"); out = new XMLWriter(new FileWriter(path), OutputFormat.createPrettyPrint()); out.write(d); // 写入到bin目录下的的xml System.out.println(d+"+write2XML"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) out.close(); //只关闭了其中的一个流,对否? } catch (IOException e) { e.printStackTrace(); } } } } ``` 三、这是导出的项目, [http://pan.baidu.com/s/1jGrg0ku](http://pan.baidu.com/s/1jGrg0ku "http://pan.baidu.com/s/1jGrg0ku")
请教java继承问题
public class test{ public static void main(String args[]){ A a= new B(); System.out.println(a.var); System.out.println(a.f()); } } class A { int var =1; int f(){ return var ; } } class B extends A { int var =2; int f(){ return var ; } } 请问为什么a.var =1,而a.f()=2。a指向子类对象的引用,调用的方法是子类的方法,为什么调用的成员变量却是父类的,请解惑。谢谢。 [b]问题补充:[/b] 第一次发贴,居然没找到地方可以回复。请指点怎样才能回复自己的帖子。 “ 属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义的变量的类型” 我也知道是这样子的,但不知道原因所以就来这问了。
关于Java鼠标监听器的问题
我按网上的鼠标监听器的内部类的方法写的结构,但是不知道为什么用鼠标之后没有结果,麻烦各位大神帮我看看 新人第一次用这个提问,关于提问的方式或者表述不清楚也欢迎大家指正啊 谢谢大家!!! buttonListener是Map1的内部类 ``` import javax.swing.*; public class test { public static void main(String[] args){ JFrame frame=new Map1(); frame.setVisible(true); new Map1(); } } ``` ``` import javax.swing.JFrame; import javax.swing.*; import java.awt.GridLayout; import java.awt.*; import java.awt.event.*; public class Map1 extends JFrame { ImageIcon bank1 = new ImageIcon("bank1.jpg");//为按钮加载图片 ImageIcon bank2 = new ImageIcon("bank2.jpg"); ImageIcon plank1 = new ImageIcon("plank1.jpg"); ImageIcon plank1_man = new ImageIcon("plank1_man.jpg"); ImageIcon plank2 = new ImageIcon("plank2.jpg"); ImageIcon plank2_man = new ImageIcon("plank2_man.jpg"); ImageIcon stump1 = new ImageIcon("stump1.jpg"); ImageIcon stump1_man = new ImageIcon("stump1_man.jpg"); ImageIcon stump2 = new ImageIcon("stump2.jpg"); ImageIcon stump2_man = new ImageIcon("stump2_man.jpg"); ImageIcon stump3 = new ImageIcon("stump3.jpg"); ImageIcon stump3_man = new ImageIcon("stump3_man.jpg"); ImageIcon water1 = new ImageIcon("water1.jpg"); ImageIcon water2 = new ImageIcon("water2.jpg"); ImageIcon water3 = new ImageIcon("water3.jpg"); ImageIcon water4 = new ImageIcon("water4.jpg"); JButton[][] button=new JButton[13][9];//创建按钮对象 public int xmove; public int ymove; public int xdecide=4; public int ydecide=12; public int decide[][]={ {0,0,0,0,0,0,0,0,0},//小人是1 {0,0,0,0,0,0,0,0,0},//木桩子是q2 {2,0,0,0,0,0,0,0,0},//桥是3 {0,0,0,0,0,0,0,0,0}, {0,0,0,0,2,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {2,0,2,3,3,3,2,0,0}, {0,0,0,0,0,0,0,0,0}, {2,0,0,0,2,0,0,0,0}, {3,0,0,0,3,0,0,0,0}, {2,0,0,0,3,0,0,0,0}, {0,0,0,0,3,0,0,0,0}, {0,0,0,0,1,0,0,0,0}, }; public Map1() { setSize(300,450);//设置大小 //JButton[][] button=new JButton[13][9];//创建按钮对象 JPanel panel=new JPanel(); setTitle("RiverCrossing"); this.add(panel); panel.setLayout(new GridLayout(13,9,0,0)); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); for(int a=0;a<9;a++) { button[0][a]=new JButton(bank2); } for(int a=0;a<9;a++) { button[12][a]=new JButton(bank1); } for(int a=1;a<12;a++) { for(int b=0;b<9;b++) { button[a][b]=new JButton(water1); } } //下面是第一个地图的(这些跟问题没关) button[2][0]=new JButton(stump1); button[6][0]=new JButton(stump1); button[8][0]=new JButton(stump1); button[10][0]=new JButton(stump1); button[3][1]=new JButton(water4); button[5][1]=new JButton(water3); button[5][2]=new JButton(water4); button[6][2]=new JButton(stump1); button[8][2]=new JButton(water4); button[2][4]=new JButton(water4); button[4][4]=new JButton(stump1); button[8][4]=new JButton(stump1); button[3][6]=new JButton(water3); button[6][6]=new JButton(stump1); button[12][4]=new JButton(stump2_man); button[0][4]=new JButton(stump3); button[9][0]=new JButton(plank2); button[9][4]=new JButton(plank2); button[10][4]=new JButton(plank2); button[11][4]=new JButton(plank2); buttonListener btListener[][]=new buttonListener[13][9];//创建监听器 for(int a=0;a<13;a++) { for(int b=0;b<9;b++) { panel.add(button[a][b]); button[a][b].addMouseListener(btListener[a][b]);//给监听器加到按钮 //System.out.printf("21"); } } } public class buttonListener implements MouseListener { public void mouseReleased(MouseEvent e) { System.out.printf("1"); outterloop:if(e.getButton() == MouseEvent.BUTTON1)//左键该执行的操作(移动小人) { for(ymove=0;ymove<13;ymove++)//行的位置 { for(xmove=0;xmove<9;xmove++)//列的位置 { if(e.getSource()==button[ymove][xmove])//点击的那个按钮的坐标 { //move(button,ymove,xmove); ymove=0; xmove=0; break outterloop; } } } } } public void mousePressed(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } } ```
java21点与自制的GUI界面
``` package a; import java.util.Scanner; import java.util.Arrays; public class Play21 { int[] cards,computer,human;//定义一副54张牌,电脑5张,玩家5张 Scanner sr=new Scanner(System.in); public Play21(){//构造方法 cards=new int[54];//定义54个大小的数组表示扑克牌 Arrays.fill(cards,0);//54张牌全赋值零,一旦某一张牌被用了就赋1 computer=new int[5];//电脑5张牌 Arrays.fill(computer,0); human=new int[5];//人5张牌 Arrays.fill(human,0); } public void clear(){//使数组内所有数据赋值0没有用过,用过的赋值1 Arrays.fill(cards,0); Arrays.fill(computer,0); Arrays.fill(human,0); } public void start(){//开始游戏 System.out.println("-------------------------------------"); System.out.println("开始游戏!"); int n=1; for(int i=0;i<1;i++){//电脑和玩家先各抽1张 computer[i]=nextOne(); human[i]=nextOne(); } while(n<5){//牌数小于5时询问是否再要牌 show(human,n,1);//显示现在玩家的牌面 if(ask(human,n)){ computer[n]=nextOne(); human[n]=nextOne(); n++; } else break; } show(human,n,1); show(computer,n,0); if(judge(human,computer,n)==1) System.out.println("\n你赢了!"); else if(judge(human,computer,n)==0) System.out.println("\n平局!"); else if(judge(human,computer,n)==-1) System.out.println("\n你输了!"); System.out.println("------------------------------------"); } void show(int[] a,int num,int c){//显示牌面,如果c是1显示的是玩家的牌面,c是0显示的是电脑的牌面,num就是第几轮 if(c==1)System.out.println("\n"+(num-2)+":你现在的牌是:"); else System.out.println("\n"+(num-2)+":电脑现在的牌是:"); for(int i=0;i<num;i++){//以此把牌都显示出来,如果是1就是A、11就是J、12就是Q、13就是K、14就是小鬼、15就是大鬼 if(a[i]==1){System.out.print("A ");continue;} if(a[i]==11){System.out.print("J ");continue;} if(a[i]==12){System.out.print("Q ");continue;} if(a[i]==13){System.out.print("K ");continue;} if(a[i]==14){System.out.print("小鬼 ");continue;} if(a[i]==15){System.out.print("大鬼 ");continue;} System.out.print(a[i]+" ");//以空格为分割以次打印 } } boolean ask(int[] a,int num){ System.out.println("\n还抽一张?Y/N"); String ch=sr.nextLine(); if(!ch.equals("n")&&!ch.equals("N")) return true; else return false; } int nextOne(){//用递归确保返回的牌没有重复 int n=(int)(Math.random()*54);//通过随机的方法产生数 if(cards[n]==0){//如果产生的那个数字曾经没有用过那么就用,否则重新产生 cards[n]=1;//用过的赋值为1 if(n==52) return 14; else if(n==53) return 15; else return n%13+1;//这个数对13取模然后加1就是产生的牌 } else return nextOne();//重新随机产生 } int judge(int[] a,int[] b,int num){//判断电脑和玩家谁的点数更接近21,如果有鬼牌就另行判断 int sum_a=0,sum_b=0;//设置两个变量为了计数 boolean joker_a=false,joker_b=false;//分别代表人和电脑是否有鬼牌,true代表有 for(int i=0;i<num;i++){//这里把电脑和人的牌总和加起来,如果有鬼牌就把joker_a或joker_b设为true,再进一步判断 if(a[i]==14||a[i]==15)joker_a=true;//14为小鬼、15为大鬼 else sum_a+=a[i];//取和 if(b[i]==14||b[i]==15)joker_b=true; else sum_b+=b[i]; } if(joker_a)if(sum_a<8)sum_a+=13;//鬼牌可以任意1-13,如果鬼牌存在,并且其余牌总和小于8,那么现在加上13就是总和 else if(sum_a<21)sum_a=21;//如果除了鬼牌其余牌大于8小于21,那么总和就是21 if(joker_b)if(sum_b<8)sum_b+=13;//电脑和人判断方法一样 else if(sum_b<21)sum_b=21; if(sum_a>21&&sum_b<=21)return -1;//最后判断大小,如果人的大于21并且电脑小于等于21那么电脑赢 if(sum_a<=21&&sum_b>21)return 1;//否则人赢 if(Math.abs(sum_a-21)<Math.abs(sum_b-21)) return 0;//一样的话平局 else //if(Math.abs(sum_a-21)>Math.abs(sum_b-21)) return -1;//否则电脑赢 } public static void main (String[] args) { Play21 p=new Play21();//创建一个对象 Scanner sr=new Scanner(System.in);//再控制台输入 String ch="y";//定义一个字符 while(true){//循环 p.start();//调用start方法 System.out.println("再来一局?Y/N"); ch=sr.nextLine();//再控制台输入y或者n if(!ch.equals("n")&&!ch.equals("N"))//判断如果不是n或者N的话就重新玩,否则游戏结束 p.clear();//调用clear方法,把所有牌都标记为0就是没用过 else break; } } } ``` ``` package a; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.LayoutStyle.ComponentPlacement; import javax.swing.SwingConstants; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class TOpoint extends Play21{ public static void main(String[] args){ JFrame f = new JFrame("21点"); f.setSize(600,450); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); f.setResizable(false); f.setLocationRelativeTo(null) ; Play21 p = new Play21(); JLabel lblNewLabel = new JLabel("你已经拥有的牌:"); JLabel lblNewLabel_1 = new JLabel("合计:"); JLabel lblNewLabel_2 = new JLabel("背面"); lblNewLabel_2.setHorizontalAlignment(SwingConstants.CENTER); JButton button = new JButton("要牌"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { } }); JLabel lblNewLabel_3 = new JLabel("玩家"); lblNewLabel_3.setHorizontalAlignment(SwingConstants.CENTER); JLabel label = new JLabel("电脑"); label.setHorizontalAlignment(SwingConstants.CENTER); JLabel label_1 = new JLabel("你已经拥有的牌:"); JLabel label_2 = new JLabel("合计:"); JLabel label_3 = new JLabel("背面"); label_3.setHorizontalAlignment(SwingConstants.CENTER); JButton button_1 = new JButton("要牌"); GroupLayout groupLayout = new GroupLayout(f.getContentPane()); groupLayout.setHorizontalGroup( groupLayout.createParallelGroup(Alignment.LEADING) .addGroup(groupLayout.createSequentialGroup() .addGap(30) .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) .addComponent(lblNewLabel_3, GroupLayout.PREFERRED_SIZE, 114, GroupLayout.PREFERRED_SIZE) .addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 192, GroupLayout.PREFERRED_SIZE) .addComponent(lblNewLabel_1, GroupLayout.PREFERRED_SIZE, 121, GroupLayout.PREFERRED_SIZE) .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING, false) .addComponent(lblNewLabel_2, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(button, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 148, Short.MAX_VALUE))) .addGap(162) .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) .addComponent(label_3, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE) .addComponent(label_2, GroupLayout.PREFERRED_SIZE, 121, GroupLayout.PREFERRED_SIZE) .addComponent(label_1, GroupLayout.PREFERRED_SIZE, 192, GroupLayout.PREFERRED_SIZE) .addComponent(label, GroupLayout.PREFERRED_SIZE, 114, GroupLayout.PREFERRED_SIZE) .addComponent(button_1, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) .addGap(26)) ); groupLayout.setVerticalGroup( groupLayout.createParallelGroup(Alignment.LEADING) .addGroup(groupLayout.createSequentialGroup() .addGap(11) .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) .addComponent(lblNewLabel_3, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE) .addComponent(label, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE)) .addGap(18) .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) .addComponent(lblNewLabel) .addComponent(label_1)) .addGap(41) .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) .addComponent(lblNewLabel_1) .addComponent(label_2)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) .addComponent(lblNewLabel_2, GroupLayout.PREFERRED_SIZE, 144, GroupLayout.PREFERRED_SIZE) .addComponent(label_3, GroupLayout.PREFERRED_SIZE, 144, GroupLayout.PREFERRED_SIZE)) .addGap(56) .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) .addComponent(button_1, GroupLayout.PREFERRED_SIZE, 38, GroupLayout.PREFERRED_SIZE) .addComponent(button, GroupLayout.PREFERRED_SIZE, 38, GroupLayout.PREFERRED_SIZE))) ); f.getContentPane().setLayout(groupLayout); } } ```
java.lang.IllegalArgumentException: object is not an instance of declaring class
目的:将目标xml的内容解析到一个java对象里边(xml的各个标签有对应的java类,并且有包含关系)。 ----------------------------------------------------------------------------------- NginxCache配置文件: <?xml version="1.0" encoding="utf-8"?> <nginx-cache> <cacheable> <include> <pattern params="a,b"> XXXAction/getXXX.rdm </pattern> <pattern params="a,b"> XXXBction/getXXX.rdm </pattern> </include> <exclude> <pattern params=""> XXXAction/getXXX.rdm </pattern> <pattern params=""> XXXBction/getXXX.rdm </pattern> </exclude> </cacheable> <cache-evict> <act pattern="XXXAction/addXXX.rdm" params="a,b"> <evict pattern="" methodRef=""> </evict> <evict pattern="" methodRef=""> </evict> </act> <method id="" name="" class="" returnType=""> <param index="1" default="c"></param> <param index="2" value="a"></param> </method> <method id="" name="" class="" returnType=""> <param index="1" default="c"></param> <param index="2" value="a"></param> </method> </cache-evict> </nginx-cache> --------------------------------------------------------------------------------- 对应的java类 --------------------------------------------------------------------------------- 具体设计思路:在解析到某个Element时调用 traverseOneElement(Element element,Object oneObj)方法;//element是遍历到对应的节点,oneObj是这个节点对应的对象。(刚开始只需要传一个确定的根类的对象即可) 在这个方法里遍历这个element的子节点,对每个子节点的element的Name用反射动态的创建对象,然后利用反射动态调用oneObj set方法,将对应的子节点对象set进去,然后,再调用 traverseOneElement(Element child_element,Object child_Obj);这样设计的, 第一次能设置成功,但是到第二次用子对象来get某个属性的时候会报这个错,不知道啥原因,请高手指教!!! ---------------------------------------------------------------------------------- 报错: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.iwint.rdm.utils.RDMPropertyUtil.getProperty(RDMPropertyUtil.java:60) at com.iwint.rdm.nginxcache.bean.NginxCache.traverseOneElement(NginxCache.java:91) at com.iwint.rdm.nginxcache.bean.NginxCache.main(NginxCache.java:79) ------------------------------------------------------------------------------ package com.iwint.rdm.nginxcache.bean; import java.util.Iterator; import java.util.Map; import org.apache.commons.collections.map.HashedMap; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.iwint.rdm.utils.Dom4jUtil; import com.iwint.rdm.utils.RDMPropertyUtil; /** * @ClassName: NginxCache * @Description: 解析NginxCache.xml用的标签类。 * @author yuanchangyou * @date 2013-9-27 * */ public class NginxCache { private static Map<String,String> classAndBiaoqian; private static NginxCache nginxCache=new NginxCache(); private Cacheable cacheable=new Cacheable(); private CacheEvict cacheEvict=new CacheEvict(); public NginxCache() { } public Cacheable getCacheable() { return cacheable; } public CacheEvict getCacheEvict() { return cacheEvict; } public void setCacheable(Cacheable cacheable) { this.cacheable = cacheable; } public void setCacheEvict(CacheEvict cacheEvict) { this.cacheEvict = cacheEvict; } public static NginxCache parseNginxCache() throws InstantiationException, IllegalAccessException, ClassNotFoundException{ //产生一个解析器对象 SAXReader reader = new SAXReader(); Document document = Dom4jUtil.parse2Document("D:/work/newEclipseWorkSpaces/rdm/src/main/resources/config/NginxCache.xml"); //获取文档的根元素 Element root = document.getRootElement(); NginxCache nginxcache=new NginxCache(); System.out.println(root.getName()); if(root.getName().equals("nginx-cache")) //遍历节点 traverseOneElement(root,nginxcache); return null; } public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { classAndBiaoqian=new HashedMap(); classAndBiaoqian.put("nginx-cache", NginxCache.class.getName()); classAndBiaoqian.put("cacheable", Cacheable.class.getName()); classAndBiaoqian.put("pattern", UrlIPattern.class.getName()); classAndBiaoqian.put("cache-evict", CacheEvict.class.getName()); classAndBiaoqian.put("nginx-cache", Act.class.getName()); classAndBiaoqian.put("include","include"); classAndBiaoqian.put("exclude", "exclude"); // parseNginxCache(); SAXReader reader = new SAXReader(); Document document = Dom4jUtil.parse2Document("D:/work/newEclipseWorkSpaces/rdm/src/main/resources/config/NginxCache.xml"); //获取文档的根元素 Element root = document.getRootElement(); // NginxCache nginxcache=new NginxCache(); // if(root.getName().equals("nginx-cache")) //遍历根节点 traverseOneElement(root,nginxCache); } public static void traverseOneElement(Element element,Object oneObj) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ // if(element.getName().equals("nginx-cache")){} Object chdil; System.out.println(element.getName()); for( Iterator iter = element.elementIterator(); iter.hasNext();){ Element elmt=(Element) iter.next(); if(elmt.getName().equals("cacheable")||elmt.getName().equals("cache-evict")){ chdil=RDMPropertyUtil.createObjByName(classAndBiaoqian.get(elmt.getName())); RDMPropertyUtil.setProperty(oneObj, elmt.getName(),chdil); Object chidObj=RDMPropertyUtil.getProperty(oneObj, elmt.getName()); traverseOneElement(elmt, chidObj); } else if(elmt.getName().equals("include")||elmt.getName().equals("exclude")||elmt.getName().equals("act")||elmt.getName().equals("method")){ Object newchil=RDMPropertyUtil.getProperty(oneObj,classAndBiaoqian.get(elmt.getName())); traverseOneElement(elmt, newchil); } else if(elmt.getName().equals("pattern")||elmt.getName().equals("param")){ } } } } ---------- package com.iwint.rdm.utils; import java.lang.reflect.Method; import java.lang.reflect.Field; import java.beans.PropertyDescriptor; public class RDMPropertyUtil { public static PropertyDescriptor getPropertyDescriptor(Class clazz, String propertyName) { StringBuffer sb = new StringBuffer(); // 构建一个可变字符串用来构建方法名称 Method setMethod = null; Method getMethod = null; PropertyDescriptor pd = null; try { Field f = clazz.getDeclaredField(propertyName); // 根据字段名来获取字段 if (f != null) { // 构建方法的后缀 String methodEnd = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); sb.append("set" + methodEnd); // 构建set方法 setMethod = clazz.getDeclaredMethod(sb.toString(), new Class[] { f.getType() }); sb.delete(0, sb.length());// 清空整个可变字符串 sb.append("get" + methodEnd); // 构建get方法 // 构建get 方法 getMethod = clazz.getDeclaredMethod(sb.toString(), new Class[] {}); // 构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中 pd = new PropertyDescriptor(propertyName, getMethod, setMethod); } } catch (Exception ex) { ex.printStackTrace(); } return pd; } //动态调用obj对象的set方法(propertyName为属性名,value为值) public static void setProperty(Object obj, String propertyName, Object value) throws InstantiationException, IllegalAccessException { if(obj==null){ obj=obj.getClass().newInstance(); } Class clazz = obj.getClass();// 获取对象的类型 PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName); // 获取 clazz 类型中的 propertyName 的属性描述器 Method setMethod = pd.getWriteMethod();// 从属性描述器中获取 set 方法 try { setMethod.invoke(obj, new Object[] { value });// 调用 set // 方法将传入的value值保存属性中去 } catch (Exception e) { e.printStackTrace(); } } //动态调用obj对象的get方法(propertyName为属性名) public static Object getProperty(Object obj, String propertyName) throws InstantiationException, IllegalAccessException { Class clazz = obj.getClass();// 获取对象的类型 // 获取clazz类型中的propertyName的属性描述器 PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName); Method getMethod = pd.getReadMethod();// 从属性描述器中获取 get 方法 Object value = null; try { value = getMethod.invoke(clazz, new Object[] {});// 调用方法获取方法的返回值 } catch (Exception e) { e.printStackTrace(); } return value;// 返回值 } //动态创建一个对象,classname 为该类的全名 public static Object createObjByName(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ return Class.forName(className).newInstance(); } }
数据库连接单例和连接池效率区别在哪?
数据库连接问题。new一个数据库的连接对象是耗时耗资源的,因此不可能对每个请求都做一遍连接创建和关闭的操作,网上给的方法一般采用连接池。我的疑问就是,我如果采用单例模式, 这样的话,如果是多个线程请求数据库操作,那么直接调用静态getInstance方法(对此方法加锁),取得同一个数据库连接对象进行数据库操作,是不是可行的。我的理解是Connection在第一次实例化时,已经确定了它要连接时那个数据库,以后的操作也不会改变这些属性,因此不存在线程安全问题,而针对数据库本身的操作,数据应该也会提供一套同步机制,避免“脏数据”。这样的话,单例模式和池化相比,采用哪种方式更好?
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
这30个CSS选择器,你必须熟记(上)
关注前端达人,与你共同进步CSS的魅力就是让我们前端工程师像设计师一样进行网页的设计,我们能轻而易举的改变颜色、布局、制作出漂亮的影音效果等等,我们只需要改几行代码,不需...
国产开源API网关项目进入Apache孵化器:APISIX
点击蓝色“程序猿DD”关注我回复“资源”获取独家整理的学习资料!近日,又有一个开源项目加入了这个Java开源界大名鼎鼎的Apache基金会,开始进行孵化器。项目名称:AP...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
编写Spring MVC控制器的14个技巧
本期目录 1.使用@Controller构造型 2.实现控制器接口 3.扩展AbstractController类 4.为处理程序方法指定URL映射 5.为处理程序方法指定HTTP请求方法 6.将请求参数映射到处理程序方法 7.返回模型和视图 8.将对象放入模型 9.处理程序方法中的重定向 10.处理表格提交和表格验证 11.处理文件上传 12.在控制器中自动装配业务类 ...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
求小姐姐抠图竟遭白眼?痛定思痛,我决定用 Python 自力更生!
点击蓝色“Python空间”关注我丫加个“星标”,每天一起快乐的学习大家好,我是 Rocky0429,一个刚恰完午饭,正在用刷网页浪费生命的蒟蒻...一堆堆无聊八卦信息的网页内容慢慢使我的双眼模糊,一个哈欠打出了三斤老泪,就在此时我看到了一张图片:是谁!是谁把我女朋友的照片放出来的!awsl!太好看了叭...等等,那个背景上的一堆鬼画符是什么鬼?!真是看不下去!叔叔婶婶能忍,隔壁老王的三姨妈的四表...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
相关热词 c#处理浮点数 c# 生成字母数字随机数 c# 动态曲线 控件 c# oracle 开发 c#选择字体大小的控件 c# usb 批量传输 c#10进制转8进制 c#转base64 c# 科学计算 c#下拉列表获取串口
立即提问