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";
}
}