JAVA1.5新特性


1 注解

@SuppressWarnings
注解类
@interface A{}
注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
java源文件--》class文件-->内存中的字节码


默认的只是class阶段
@Retention(RetentionPolicy.RUNTIME) //详细见api
@Target({ElementType.TYPE,ElementType.METHOD})


为注解添加属性
当属性为value 时  在运用时 可以省略 value属性名
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface AnnotationTest {
String name() default "nobody" ;
int[] arr();
As as();  //注解类型
Class<?> getObjectClass(); //class类型
}


2 泛型---是给编译器看的

泛型是提供给javac编译器使用的,可以限定集合中的输入类型
编译后的字节码是一样的  也就是说编译后的class文件 是可以进行
添加别的类型
List<String> ls = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
System.out.println(ls.getClass() == l2.getClass());
List.class.getMethod("add", Object.class).invoke(l2, "abc");
System.out.println(l2.get(0));


List<String> ls = new ArrayList();
List ls = new ArrayList<String>();---正确编译




List<String> l2 = new ArrayList<Object>();
List<Object> l2 = new ArrayList<String>();---编译错误


泛型中的?  即泛型的通配符
public static void prints(List<?> ls){
for(Object o : ls){
System.out.println(o);
}}
public static void prints(List<? extends Object> ls){
for(Object o : ls){
System.out.println(o);
}
}
? super obj  向上通配符 父类
? extends obj 向下通配符 子类
//综合案列
public static void printss(List<? extends A> ls){
for(A o : ls){
o.prints(ls.size());
}}


interface A{
public void prints(Object o);
}
class B implements A{
@Override
public void prints(Object o) {
// TODO Auto-generated method stub
System.out.println(o);
}
}<pre name="code" class="java">/**
自定义泛型类 自定义泛型方法 泛型所定义的对象 不能是基本类型有返回值 优先返回值无返回值 则是最大交集* 自定义加法* @param x* @param y* @return* @throws Exception*/@SuppressWarnings("unchecked")public static<T extends Number> T jia(T x,T y) throws Exception{T t = null;if(x.getClass() == Integer.class){t = (T)(Integer)(x.intValue() + y.intValue());}else if(x.getClass() == Double.class){t = (T)(Double)(x.doubleValue() + y.doubleValue());}else if(x.getClass() == Float.class){t = (T)(Float)(x.floatValue() + y.floatValue());}return t;}
 参数的类型推断泛型类JVM提供了3个类加载器类加载的委托机制BootStrap   ExtClassLoader AppClassLoader第一个加载器  BootStrap 这个是放在内核之中 也是顶级的加载器用来加载jre/lib/rt.jar  ---jdk第二个加载器  ExtClassLoader 是BootStrap 的子类 是AppClassLoader的父类用来加载 jre/lib/ext/*.jar  ---用户自定义的jar包类加载的委托机制 ---》BootStrap --》ExtClassLoader ---》AppClassLoader先从父类的加载器开始找自定义的类加载器 extends ClassLoaderJVM 加载一个类的时候使用当前线程的类加载器 去加载线程中的第一个类 
package test;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

public class MyClassLoader extends ClassLoader {
	/**
	 * 目录
	 */
	private String dir ;
	public MyClassLoader(String dir){
		this.dir = dir;
	}
	/**
	 * 返回当前加载器的目录
	 * @return
	 */
	public String getDir(){
		return dir;
	}
	public void setDir(String dir){
		this.dir = dir;
	}
	/**
	 * 寻找 className 然后类加载器会去自动加载该 className
	 * @param name为class路径
	 * @throws ClassNotFoundException 
	 */
	@SuppressWarnings("deprecation")
	@Override
	protected Class<?> findClass(String className) throws ClassNotFoundException  {
		String filepath = dir +"/"+ className+".class";
		FileInputStream fl = null;
		ByteArrayOutputStream bs = null;
		try {
			fl = new FileInputStream(new File(filepath));
			bs = new ByteArrayOutputStream();
			encrypt(fl,bs);
			fl.close();
			byte[] bytes =  bs.toByteArray();
			System.out.println("come in findClass");
			return this.defineClass(bytes, 0, bytes.length);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
		} catch (IOException e) {
		} finally{
			try {
				if(fl!=null && bs != null){
					fl.close();
					bs.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
			}
		}
		return super.findClass(className);
	}
	/**
	 * 对class文件进行加密处理
	 * @param is
	 * @param out
	 * @throws IOException
	 */
	public void encrypt(InputStream is, OutputStream out) throws IOException{
		int i = -1;
		while((i = is.read())!= -1){
			out.write(i^0xff);
		}
		is.close();
		out.close();
	}
	
	public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		//"C:\Users\李昂志\workspace\TestOne\bin\test"  "TestLoader.class"
		MyClassLoader  m= new MyClassLoader("idcastlib");
//		Date t = (Date)m.loadClass("TestLoader").newInstance();
//		System.out.println(t.toString());
		TestLoader s = (TestLoader) m.loadClass("test.TestLoader").newInstance();
		System.out.println(s.toString());
	}
}
class TestLoader extends Date{
	private static final long serialVersionUID = 1L;

	public String toString(){
		return "TestLoader toString";
	}
}


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值