您的位置:首页 > 编程语言 > Java开发

java基础加强--要点总结4

2011-03-19 18:39 453 查看
java基础加强

49.泛型的实际参数应该是引用类型,不能是基本数据类型。

50.利用泛型进行数组和集合之间相互拷贝的相关程序

public class GenericDAO<T>{
private T field;
public void save(T boj){}
public T getById(int id){}
}


54.根据反射来获得泛型的实际参数类型

package jiami;
import java.io.*;
public class JiamiTest {

public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
String srcpath =  "C://Documents and Settings//kaikai//桌面//java//Practice//bin//jiami//SrcFile.class";
String despath = "C://SrcFile.class";
FileInputStream fi = new FileInputStream(srcpath);
FileOutputStream fo = new FileOutputStream(despath);
jiami(fi,fo);
fi.close();
fo.close();
}
public static void jiami(InputStream in, OutputStream out)throws Exception {
int b=-1;
while((b=in.read())!=-1) {
out.write(b^0xff);
}
}

}
*****************************************
package jiami;

import java.util.Date;

public class SrcFile extends Date {

@Override
public String toString() {
return "heill,kenny!";
}
public static void main(String[] args) {

}

}


59.自制类加载器,包括加密解密

package proxytest;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;

public class ProxyTest {

public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
Collection proxy = (Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler() {
ArrayList target = new ArrayList();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
long start = System.currentTimeMillis();//代理程序添加的代码
Object retVal = method.invoke(target, args);//执行目标程序的方法
long end = System.currentTimeMillis();//代理程序添加的代码
System.out.println(method.getName()+":"+(end-start));//代理程序添加的代码,打印执行时间

return retVal;
}
}
);
//System.out.println("xxx2");
proxy.add("fsda");
//System.out.println("xxx");
proxy.add("gdsf");
proxy.add("fdsaf");
System.out.println(proxy.size());
}

}


66.将InvocationHandler中我们自己的代码抽取出来,以一个对象的方式传递进去,有助于代码良好的封装。让下面的代码来说明一切吧!

package proxytest;
import java.io.*;
import java.util.Properties;
import java.util.*;
public class BeanFactory {
Properties pro = new Properties();
public BeanFactory(InputStream in) {
try {
pro.load(in);//加载配置文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception{

InputStream in = BeanFactory.class.getResourceAsStream("config.properties");//得到配置文件的输入流
Object bean = new BeanFactory(in).getBean("classname");//配置文件的属性名
System.out.println(bean.getClass().getName());
/*Collection proxy = (Collection)bean;
proxy.add("fsda");
proxy.add("gdsf");
proxy.add("fdsaf");
System.out.println(proxy.size());*///如果使用了代理类,并且target是ArrayList的话可以用这段代码检验一下

}
public Object getBean(String name)throws Exception {
String clazzname = pro.getProperty(name);//得到属性值
Object bean = null;
try {
Class clazz = Class.forName(clazzname);
bean = clazz.newInstance();//实例化
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(bean instanceof ProxyTest) {
//System.out.println("fda");//如果是属于代理的话执行下面的代码
ProxyTest proxyTest = (ProxyTest)bean;
Advice advice = (Advice)Class.forName(pro.getProperty((name+".advice"))).newInstance();
Object target = Class.forName(pro.getProperty((name+".target"))).newInstance();
proxyTest.setAdvice(advice);
proxyTest.setTarget(target);
Object proxy = proxyTest.getProxy();//因为ProxyTest使用到了Advice和target,所以需要得到这两个的实例对象
return proxy;
}
return bean;
}

}
*********************************
package proxytest;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;

public class ProxyTest {
private Object target;
private Advice advice;

public Object getProxy() {
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
advice.beforeMethod(method);//将我们添加的代码用对象的形式传进来,有助于良好的封装性
Object retVal = method.invoke(target, args);
advice.afterMethod(method);//将我们添加的代码用对象的形式传进来,有助于良好的封装性

return retVal;
}
}
);
return proxy;
}

public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Advice getAdvice() {
return advice;
}
public void setAdvice(Advice advice) {
this.advice = advice;
}

}
*****************************************
config.properties文件和其他类在同一个包中,下面是有关内容:
#使用普通类
#classname = java.util.ArrayList
#使用代理类
classname = proxytest.ProxyTest
#下面的两条属性是proxytest用到的,如果是普通类的话不会使用
classname.advice = proxytest.MyAdvice
classname.target = java.util.ArrayList


68.java基础加强部分终于看完了,博客中的所有代码都是我在看完视频后亲手演练的。这几天虽然很累,但也收获了不少东西,编码能力也有所加强。明天继续努力,争取尽早看完所有视频。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: