类加载器&注解&动态代理

来源:互联网 发布:oecd2013年税收数据 编辑:程序博客网 时间:2024/05/29 04:49
一、类加载器
1.什么是类加载器,作用是什么?
类加载器就加载字节码文件(.class)
2.类加载器种类
(1)BootStrap:引导类加载器:加载都是最基础的文件
(2)ExtClassLoader:扩展类加载器:加载都是基础的文件
(3)AppClassLoader:应用类加载器:三方jar包和自己编写java文件
怎么获得类加载器?
ClassLoader字节码对象.getClassLoader();
二、注解@xxx
1什么是注解,注解作用?
注解就是符合一定格式的语法
注释:在阅读程序时清楚给程序员看的
注解:给jvm看的,给机器看的
@Override:帮助开发人检查是否覆盖父类的方法正确
2.注解的类型
基本类型,string,枚举类型,注解类型,Class类型,以上类型的一维数组
3.解析使用了注解的类
元注解:代表修饰注解的注解,作用:限制定义的注解的特性
@Retention
SOURCE:注解在源码级别可见
CLASS:注解在字节码文件级别可见
RUNTIME:注解在整个运行阶段都可见
@Target
代表注解修饰的范围,类上使用,方法上使用,字段上使用
FIELD;字段上可用此注解
METHOD:方法上可以用此注解

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

@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface MyAnno {String name();//注解的属性int age()default 20;//String value();}public class MyAnnoTest {@MyAnno(name = "zhangsan")//@MyAnno("xxx")public void show(String str){System.out.println("show running.....");}}class MyAnnoParser{public static void main(String[] args) throws NoSuchMethodException, SecurityException{//解析show方法上面的@MyAnno//直接目的是获得show方法上的参数//获得show方法的字节码对象Class clazz=MyAnnoTest.class;Method method=clazz.getMethod("show",String.class);MyAnno annotation=method.getAnnotation(MyAnno.class);//获得注解上的属性值System.out.println(annotation.name());System.out.println(annotation.age());//根据业务需求写逻辑代码}}自实现测试@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface MyTest {}public class MyTestRarster {public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{Class clazz=TestDemo.class;//获得所有的方法Method[] methods=clazz.getMethods();if(methods!=null){for(Method method:methods){//获得注解使用@MyTest的方法boolean annotationParesent=method.isAnnotationPresent(MyTest.class);if(annotationParesent){//该方法使用了mytest注解method.invoke(clazz.newInstance(),null);}}}}}public class TestDemo {@Testpublic void test1(){System.out.println("test running...");}@MyTestpublic void test2(){System.out.println("test2 running...");}}
注意:JDK的Proxy方式实现的动态代理  目标对象必须有接口  没有接口不能实现jdk版动态代理

public interface TargetInterface {public void method1();public String method2();public int method3(int x); }public class Target implements TargetInterface{public void method1(){System.out.println("method1 running");}@Overridepublic String method2() {System.out.println("method2 running....");return "method2";}@Overridepublic int method3(int x) {return x;}}public class ProxyTest2 {public static void main(String[] args) {Target target=new Target();//动态创建代理对象TargetInterface proxy=(TargetInterface)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//反射知识Object invoke=method.invoke(target, args);//目标对象的响应的方法return invoke;}});proxy.method1();//调用invoke}}



原创粉丝点击