java学习

java学习

 

java反射的理解

初学者可能会想反射是什么,有什么作用。那我就以一个简单的小需求开始。现在有3个类,A,B,C. 现在我想要一个方法,根据输入的字符串,获取相应的实例对象,即当我给这个对象传入“A”的时候,我要获取一个A实例,传入“B”的时候获取一个B实例,有人说用if, 那么如果有1000个类,就用1000if或者case么,而且,如果不事先知道有多少种情况呢?

要解决这个问题,我们先从基础知识开始学习。

Java程序执行的时候,在这个进程中,内存分为代码区,静态存储区,堆内存和栈内存。一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。静态存储区,主要是用来存储字符串和类的静态成员变量等。现在说到了对于反射来讲很重要的一块内存,代码区(CodeSegment)。代码区主要存放的是加载到内存的二进制文件。注意,这不是对象实例,而是那些一个个还没有被唤醒的.class文件。

从面相对象的角度来讲,这些文件都是一类,都是Class类。至于如何理解.class文件对象和实例对象,我是这样理解的。在代码区的.class对象就像是下载视频的种子,虽然它并不是一个实实在在的视频,但是必须要通过这个种子才能获得视频文件,而且一个种子可以使用多次。相对应的,在程序中.class文件对象,要通过这个对象来获取需要的对象,而且能多次使用。

Java虚拟机中,有一个很重要的搬运工的角色,就是ClassLoader,这是一大类Class,它们的作用就是把相应的用到的二进制的Class文件加载到内存中。注意,这里有一个动态的加载机制,不是说,在程序启动的时候,如果ClassPath下有100.class文件,就会把所有的二进制码一下子加载到内存中,而是刚刚开始的时候JVM使用ClassLoader把最初的几个.class二进制码Load到内存中,之后的是用到的时候才加载,慢慢的会有更多的加载到存中。当然也可以通过代码显示的要求立即把相应的二进制类代码加载到内存,如JDBC驱动的加载 Class.forName("com.mysql.jdbc.Driver")

在这里有一个相关的知识点就是static静态语句块的问题。有人说,静态语句块是第一次new对象的时候执行,这种说法是不准确的,确切的说,是加载到内存中的时候执行。一般来讲我们自己写的类,是用的时候才加载到内存,而我们用的方式,一般都是new一个对象,一般不会强制显示的去加载,所以,大家就以为是第一次实例化的时候执行。如果我们使用Class.Forname显示的把它load到内存,而并不new对象,可以发现,此时静态代码块也执行了。

现在解决最初提出的那个问题,只需要一句代码

String type = “A”;

Object o = Class.forName(type).newInstance();

下面是有关反射使用的一些常用的方法,包括获取成员方法等。从面相对象的角度看,类中的一个个属性或者方法都是对象,要让其执行,调用invoke就可以了。

posted @ 2012-12-29 14:52 杨军威 阅读(249) | 评论 (0)编辑 收藏

ext验证正整数

minValue : 1,
            xtype : 'numberfield',
            regex: /^\d+$/,//验证数字

posted @ 2012-12-28 16:44 杨军威 阅读(428) | 评论 (0)编辑 收藏

servlet各种监听器

目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中 HttpSessionAttributeListener与HttpSessionBindingListener皆使用 HttpSessionBindingEvent;HttpSessionListener和 HttpSessionActivationListener则都使用HttpSessionEvent;其余Listener对应的Event如下所 示:

Listener接口

Event

ServletContextListener

ServletContextEvent

ServletContextAttributeListener

ServletContextAttributeEvent

HttpSessionListener

HttpSessionEvent

HttpSessionActivationListener

HttpSessionAttributeListener

HttpSessionBindingEvent

HttpSessionBindingListener

ServletRequestListener

ServletRequestEvent

ServletRequestAttributeListener

ServletRequestAttributeEvent


分别介绍:
一 ServletContext相关监听接口
补充知识:
通过ServletContext 的实例可以存取应用程序的全局对象以及初始化阶段的变量。
在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
注意:
全局对象即Application范围对象,初始化阶段的变量指在web.xml中,经由<context-param>元素所设定的变量,它的范围也是Application范围,例如:

<context-param>
<param-name>Name</param-name>
<param-value>browser</param-value>
</context-param>
当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:
String name = (String)application.getInitParameter("Name");
或者使用EL时:
${initPara.name}
若是在Servlet中,取得Name的值方法:
String name = (String)ServletContext.getInitParameter("Name");


1.ServletContextListener:
用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。
ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

ServletContextListener接口的方法:
void contextInitialized(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被加载及初始化。
void contextDestroyed(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被载出。

ServletContextEvent中的方法:
ServletContext getServletContext()
取得ServletContext对象


2.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。

ServletContextAttributeListener接口方法:
void attributeAdded(ServletContextAttributeEvent scab)
若有对象加入Application的范围,通知正在收听的对象
void attributeRemoved(ServletContextAttributeEvent scab)
若有对象从Application的范围移除,通知正在收听的对象
void attributeReplaced(ServletContextAttributeEvent scab)
若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象


ServletContextAttributeEvent中的方法:
java.lang.String getName()
回传属性的名称
java.lang.Object getValue()
回传属性的值

二、HttpSession相关监听接口
1.HttpSessionBindingListener接口
注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener

当我们的类实现了HttpSessionBindingListener接口后,只要对象加入Session范围 (即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的 removeAttribute方法的时候或Session Time out的时候)时,容器分别会自动调用下列两个方法:
void valueBound(HttpSessionBindingEvent event)
void valueUnbound(HttpSessionBindingEvent event)

思考:如何实现记录网站的客户登录日志, 统计在线人数?

2.HttpSessionAttributeListener接口
HttpSessionAttributeListener监听HttpSession中的属性的操作。
当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。这和ServletContextAttributeListener比较类似。

3.HttpSessionListener接口
HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。

4.HttpSessionActivationListener接口
主要用于同一个Session转移至不同的JVM的情形。

四、ServletRequest监听接口
1.ServletRequestListener接口
和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
2.ServletRequestAttributeListener接口
和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest

posted @ 2012-12-28 15:12 杨军威 阅读(477) | 评论 (0)编辑 收藏

系统启动调用线程的方法

1.新建类继承Thread,
2.把此类交给spring管理
<bean id="b" class="" init-method="start" />
当系统启动时就可以了

posted @ 2012-12-27 14:01 杨军威 阅读(193) | 评论 (0)编辑 收藏

获得地址栏中的地址

var url = window.location.href;

posted @ 2012-12-27 13:07 杨军威 阅读(108) | 评论 (0)编辑 收藏

ServletContextListener的配置

新建一个java类,实现
ServletContextListener
接口,在web.xml中配置
<listener>
      <listener-class>类的完全限定名</listener-class>
  </listener>

posted @ 2012-12-27 12:58 杨军威 阅读(288) | 评论 (0)编辑 收藏

使用hibernate按条件查询拼sql方法

方法1.例如:

StringBuffer sql = new StringBuffer();
        sql.append("from Book b where 1=1 ");
        if(!"".equals(sum)&&sum!=null){
            sql.append(" and b.sum ='"+sum+"'");
        }
        if(!"".equals(aut)&&aut!=null){
            sql.append(" and b.author ='"+aut+"'");
        }
        if(!"".equals(pub)&&pub!=null){
            sql.append(" and b.publish ='"+pub+"'");
        }
        if(!"".equals(rfid)&&rfid!=null){
            sql.append(" and b.addRfidSum ='"+rfid+"'");
        }
方法2.
StringBuffer sql = new StringBuffer();
        sql.append("from Book b where ");
        if(!"".equals(sum)&&sum!=null){
            sql.append(" b.sum ='"+sum+"' and ");
        }
        if(!"".equals(aut)&&aut!=null){
            sql.append(" b.author ='"+aut+"' and ");
        }
        if(!"".equals(pub)&&pub!=null){
            sql.append(" b.publish ='"+pub+"' and ");
        }
        if(!"".equals(rfid)&&rfid!=null){
            sql.append(" b.addRfidSum ='"+rfid+"' and ");
        }
        String s = sql.toString();
         s=s.substring(0,s.lastIndexOf(" and ")>0? s.lastIndexOf(" and "):s.indexOf("where"));
         System.out.println(s);

当心在单引号和双引号中间不要有空格,不然会出错

posted @ 2012-12-26 13:22 杨军威 阅读(608) | 评论 (0)编辑 收藏

DirectJNgine类中获取application,session,Request,Response对象

WebContext context = WebContextManager.get();
HttpSession session = context.getSession();
ServletContext application = context.getServletContext();
context.getRequest();
 context.getResponse();
   

posted @ 2012-12-25 13:44 杨军威 阅读(214) | 评论 (0)编辑 收藏

日期转换

String s = "2012-08-25";  
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");  
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年M月d日");  
try {  
    System.out.println(sdf2.format(sdf1.parse(s)));  
} catch (ParseException e) {  
   
    e.printStackTrace();  

posted @ 2012-12-20 16:21 杨军威 阅读(124) | 评论 (0)编辑 收藏

根据访问者的ip地址自动显示所在地天气,好用的接口



根据有道的API 先根据IP确定城市 在根据城市获取天气

posted @ 2012-12-20 12:59 杨军威 阅读(274) | 评论 (0)编辑 收藏

仅列出标题
共43页: First 上一页 35 36 37 38 39 40 41 42 43 下一页 

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜