---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
1、 类加载器
类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。
ClassLoader类使用委托模型来搜索类和资源。每个ClassLoader实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机的内置类加载器(称为 "bootstrap class loader")本身没有父类加载器,但是可以将它用作ClassLoader实例的父类加载器
classLoader的方法:
defineClass(String name,byte[] b,int off,int len):将一个 byte 数组转换为 Class 类的实例。必须分析 Class,然后才能使用它
findClass(String name) 使用指定的二进制名称查找类
publicclass ClassLoadTest
{
publicstaticvoid main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException
{
//获得ClassLoadTest类的加载器的Class
Class c1 = ClassLoadTest.class.getClassLoader().getClass();
//输出ClassLoadTest类的加载器的名字
System.out.println(c1.getName());
//获得ClassLoadTest类的加载器并输出,发现为null
//Class c2 = System.class.getClassLoader().getClass();
//System.out.println(c2);
//获得ClassLoadTest类的加载器
ClassLoader loader = ClassLoadTest.class.getClassLoader();
//一层一层向上输出ClassLoadTest类的加载器的父类
while(loader!=null)
{
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
System.out.println(loader);
}
}
自定义类加载器MyclassLoader
publicclass MyClassLoader extends ClassLoader
{
private String classpath;
//加密函数,同时也是解密函数
publicstaticvoid cypher(InputStream is,OutputStream os) throws IOException
{
int b = 0;
while((b=is.read())!=-1)
{
//按位取反
os.write(b^0xff);
}
is.close();
os.close();
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
//该路径是加密过的文件的路径
String filepath = classpath+"\\"+name+".class";
FileInputStream fis = null;
try
{
fis = new FileInputStream(filepath);
//定义字节数组存储解密之后的字节数据
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//对加密过的文件进行解密
cypher(fis,bos);
fis.close();
byte[] buf = bos.toByteArray();
//固定格式,将字节数组转化成class加载
return defineClass(null, buf, 0, buf.length);
}
catch(Exception e)
{
e.printStackTrace();
}
returnsuper.findClass(name);
}
public MyClassLoader(String classpath)
{
this.classpath = classpath;
}
}
调用自定义的类加载器
Class cc = new MyClassLoader("lsklib").findClass("ClassLoaderAttachments");
Date d1 = (Date) cc.newInstance();
System.out.println(d1);
2、 注解
Java自带的注解:
1、 @SuppressWarnings,压缩警告注解。该注解可以实现对某些不必要的警告实行封闭,使其不出现改不必要警告的提醒。
2、 @Deprecate,标注属性或方法过时。
3、 @Override,标注方法被覆盖
注解相当于一种标记,在程序中加上了注解就是给程序打上了某种标记。Java编译器、开发工具和其他程序用反射来了解你的类上有无何种标记。标记可以加在包、类、字段、方法、方法的参数以及局部变量上。
元注解:
Retention: 指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
RetentionPolicy.SOURCE: 编译器要丢弃的注释
RetentionPolicy.CLASS: 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释
RetentionPolicy.RUNTIME: 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取
Target: 指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。例如,此元注释指示该声明类型是其自身,即元注释类型。
下面是自定义的元注解
import java.lang.annotation.*;
@Target(ElementType.ANNOTATION_TYPE)
public@interfaceMeteannotation {
String value();
}
自定义的注解:
import java.lang.annotation.*;
//一直保留到运行
@Retention(RetentionPolicy.RUNTIME)
public@interfacelskAnnotation
{
String color() default"red";
String value();
int[] arr() default {8,3,0};
Meteannotation m() default@Meteannotation("haha");
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------