黑马程序员—类加载器和注解

---------------------- <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>、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值