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

本文深入探讨Java中的类加载器工作原理及其自定义方式,并详细解析Java注解的功能与应用场景,包括自定义注解及元注解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"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.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距填充,对 html body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值