类加载器、注解

类加载器

类加载器就是加载字节码文件(.class)

demo.java ->编译器->demo.class->类加载器 (将.class字节码文件加载到内存并且生成字节码对象Class)->可以进行反射 对Class对象在运行出结果之前进行动态的修改

类加载器的种类 有三种 不同类加载器加载不同的

1.BootStrap:引导类加载器-家在都是最基础的文件

2.ExtClassLoader:扩展类加载器 -家在都是基础的文件

3.AppClassLoader:应用类加载器 -三方jar包和自己编写的java文件

获得类加载器

ClassLoader 字节码对象.getClassLoader();

注解

注解就是符合一定格式的语法 @xxx

注解的作用:

  注释:给程序员看的

  注解:给jvm看的,给机器看的

注解在目前最主流的应用是:代替配置文件

关羽配置文件与注解开发的优缺点:

  注解优点:开发效率高 成本低

  注解缺点:耦合性大 并不利于后期维护

@Override:告知编译器此方法是重写的

@Deprecated:标注过时的

@SuppressWarnings:压制警告 让编译器不报黄线 红线

不同的注解只能在不同的位置使用(方法、字段、类上)

@WebServlet(name = "TestServlet",urlPatterns = "/TestServlet")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

@WebServlet注解 相当于在web.xml中配置如下

    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>com.david.web.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/TestServlet</url-pattern>
    </servlet-mapping>

自定义注解

关键字 @interface

注解的属性:

  语法:返回值 名称();

package com.david.myInterface;
//定义注解
public @interface zhujie {
    //注解的属性
    String name();
    //定义属性 默认值28 调用时可以不写
    int age() default 28;
}

使用注解

@zhujie(name="haha")
    public boolean AddUser(User user) throws SQLException {
        UserDao dao = new UserDao();
        return dao.AddUser(user);
    }

注意:如果属性的名字是value,并且注解的属性只有一个,那么使用注解时可以省略value

package com.david.myInterface;
//定义注解
public @interface zhujie {
    String value();
}

使用时可以省略value="xxx"

@zhujie("xxx") 

注解的属性类型只能是以下几种:

基本类型、String、枚举类型、注解类型、Class类型、以上类型的数组类型

元注解:代表修饰注解的注解,作用是限制定义的注解的特性

@Retention

  SOURCE:注解在源码级别可见

  CLASS:注解在字解码文件级别可见

  RUNTIME:注解在整个运行阶段都可以见
@Target

  代表注解修饰的范围:类上使用、放过发上使用,或字段上使用

  FIELD:字段上可用此注解

  METHOD:方法上可以用此注解

  TYPE:类/接口上可以使用此注解

@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.CLASS)
public @interface zhujie {
    String value();
}

使用注解

public class zhujieTest {

    @zhujie("hhh")
    public void Show(String c){
        System.out.println(c);
    }
}

通过反射获得注解的值

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Class c = zhujieTest.class;
        try {
            Method m = c.getMethod("Show",String.class);
            zhujie z = m.getAnnotation(zhujie.class);
            System.out.println(z.value());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }
原文地址:https://www.cnblogs.com/baidawei/p/9037379.html