午后星期午

2014年3月25日 #

Java 单例模式详解

     摘要: 概念:  java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。  单例模式有一下特点:  1、单例类只能有一个实例。  2、单例类必须自己自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对...  阅读全文

posted @ 2014-03-27 01:20 午后星期午 阅读(82) | 评论 (0)编辑 收藏

值传递、引用传递的区别

所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。
所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变。
值传递,例如:
class TestT1 
public static void main(String[] args) 
int i = 5; 
int j = 6; 
System.out.println("before exchange i = "+i);//交换前
exchange(i, j); 
System.out.println("after exchange i = "+i);//交换后
}
public static void exchange(int a,int b) 
int k;
k = a;a = b; b = k; 
程序的结果是5!!! 
这说明,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为。 
Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,但这只是在Java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用。
引用传递,例如:
class TestT2
public static void main(String[] args) 
StringBuffer s= new StringBuffer("good"); 
StringBuffer s2=s; 
s2.append(" afternoon."); 
System.out.println(s); 
对象s和s2指向的是内存中的同一个地址因此指向的是同一个对象。 
这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的。 
程序运行的输出是: 
good afternoon. 
这说明s2和s是同一个对象。
总结: 
大家都知道,在JAVA中变量有以下两种:
基本类型变量,包括boolean、byte、char、short、int、long、float、double。
引用类型变量,包括类、接口、数组(基本类型数组和对象数组)。
对于基本类型和基本类型变量被当作参数传递给方法时,是值传递。在方法实体中,无法给原变量重新赋值,也无法改变它的值。
而对象作为参数,如果在方法中把对象作为参数,方法调用时,参数传递的是对象的引用,即在方法调用时,实际参数把对对象的引用传递给形式参数。这是实际参数与形式参数指向同一个地址,即同一个对象,方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。

形参和实参有以下显著的区别:
    1、形参不能离开方法。形参只有在方法内才会发生作用,也只有在方法中使用,不会在方法外可见。而实参可以再程序的任何地方都使用。
    2、形参代表一个合集,具有不确定性,而形参代表一个独立事物,具有确定性(即使是为null)。也就是说,形参不能代表具体的对象,只能代表这些对象共同的属性(比如超类、各种其他自定义属性等等),而实参则是具体的对象(比如超类的实例)。
    3、形参的值在调用时根据调用者更改,实参则用自身的值更改形参的值(指针、引用皆在此列)

posted @ 2014-03-26 22:29 午后星期午 阅读(126) | 评论 (0)编辑 收藏

使用Spring mvc 利用java的反射技术,来扫描对应包下的注解请求url 统一保存在数据库中

仅对  @requestMapping("/xxxx/其他参数")  的格式
 package cc.wshao.springmvc.util;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import cc.wshao.springmvc.service.RightService;
public class RegRightUtils {
private static final String rootUrl = "/spring";
private static RightService rightService;
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
  rightService = context.getBean(RightService.class);
ClassLoader classLoader = RegRightUtils.class.getClassLoader();
URL url = classLoader.getResource("com/er07/book/springmvc/controller");
String rootPath = url.getPath().toString();
File rootFile = new File(rootPath);
File [] files = rootFile.listFiles();
for(File f: files) {
System.err.println(f.getName());
String className = f.getName().substring(0, f.getName().indexOf(".class"));
Class clazz = Class.forName("com.er07.book.springmvc.controller."+className);
parseClass(clazz);  //解析  出url
}
 
}
public  static void parseClass(Class clazz) {
 
if(clazz.isAnnotationPresent(Controller.class)) {   //是否为一个controller ? 
String classUrl ="";
 if(clazz.isAnnotationPresent(RequestMapping.class)) {
 RequestMapping requestMapping_clazz = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
  classUrl = requestMapping_clazz.value()[0];
  
  if(classUrl.equals("/")) {  //如果是"/" 的话  制空    
  classUrl ="";
  }
 }
 Method [] ms = clazz.getDeclaredMethods();
 
 for(Method m :ms) {
 
 if(m.isAnnotationPresent(RequestMapping.class)) {
 RequestMapping requestMapping_method = m.getAnnotation(RequestMapping.class);
 String methodUrl = requestMapping_method.value()[0];
 
   int  index = methodUrl.indexOf("/");
   index = methodUrl.indexOf("/",index+1);
   if(index!=-1) {  //如果存在 则进行截取前面的url 
   
    methodUrl = methodUrl.substring(0, index);
   }
 String resultUrl = rootUrl+classUrl+methodUrl;
 rightService.appendRightByUrl(resultUrl);
 }
 }
}
}
}
//实现方法: 
public void appendRightByUrl(String url) {
//查询 此url 在数据库中是否存在  此权限
String hql = "from Right where rightUrl =?";
Right r = (Right) this.rightDao.uniqueResult(hql, url);
if(r==null) { //不存在 , 插入数据库中
Right newRight = new Right();
newRight.setRightUrl(url);
this.saveOrUpdateRight(newRight);
}
}

posted @ 2014-03-25 14:54 午后星期午 阅读(1235) | 评论 (0)编辑 收藏