1.Class下的newInstance()和new有什么区别?
(1).newInstance()是一个方法,而new是一个关键字
(2).Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制。
引申介绍:Class.forName("")返回的是类 Class.forName("").newInstance()返回的是object
为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?
即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);
而有一些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?
Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码段。
而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}
既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。
从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:
(1)、这个 类已经加载;(2)、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,
这个静态方法调用了启动类加载器,即加载 java API的那个加载器。
现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造
再介绍:(来源:http://blog.csdn.net/qianzhiyong111/article/details/6614807)
java里面任何class都要装载在虚拟机上才能运行,Class.forName(xxx)就是装载类用的.
Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:
class c = Class.forName(“Example”); factory = (ExampleInterface)c.newInstance();
其中ExampleInterface是Example的接口,可以写成如下形式:
String className = "Example"; class c = Class.forName(className); factory = (ExampleInterface)c.newInstance();
进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串 class c = Class.forName(className); factory = (ExampleInterface)c.newInstance();
上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。
2.mysql代码报错:Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)
数据库连接的时候报错 lost connection to mysql server during query
(1).检查tomcat的context.xml配置文件的内容 Resource
(2).mysql启动不稳定,重启即可
3.关于spring配置中的hibernateTemplate:
最常用的有两种
第一种是手动配置HibernateTemplate,即在实现的Dao中加上下面这句话
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
并在applicationContex.xml中添加如下配置
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
第二种是采用Hibernate提供的HibernateDaoSupport,即让实现的Dao去继承HibernateDaoSupport,此时无需手动配置HibernateTemplate,只要在applicationContext.xml中添加如下配置
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
关于上面这xml配置,其实在配置事务的时候也要用到,即第一种配置已经包含了第二种配置。
4.ie6 下bug
(1)max-length,min-length, 等在ie6下识别不了,需要写成
height:expression(document.body.clientHeight > 182 ? "182px": "auto");/*for ie6*/
(2)当某position:relative元素 被带有overflow:auto/scroll属性的块级元素包含时,会表现出postion:absolute的行为。
解决方法:a.为包含块元素添加属性position:relative 。
b.把该元素的position:relative属性去掉,使用默认的static定位,并通过margin-top等属性实现类似的效果
(3)png图片在ie6下出现透明或者背景变灰的bug
a.使用滤镜,语法如下
.image-style { background-image: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="filename.png", sizingMethod="scale"); }
注意:使用滤镜需要性能损耗。
b.给IE6单独制作一张.gif图片,打上hack
.image-style{ background:transparent url("filename.png") no-repeat scroll 0 0;
_background-image:url("filename.gif"); }
这种方法只需要在切图时多存储一份.gif格式的图片,一般采用这种方法。
(4)ie6下overflow失效:
给父元素设置宽度或者父元素设置position即可。
(5)设置透明度无效
ie7以下设置透明度应为 filter:alpha(opacity=50); 取值为(0-100)