类加载器
类加载器就是加载字节码文件(.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(); } }