注解与反射(java基础)

                                                                  注解和反射

 *  注解:Annotation,Java标注,JDK5引入的一种机制。
 *  Java中类,方法,变量,参数,包都可以被标注
 *
 *  元注解:专门给注解加的注解
 *
 *  我们发现注解中可以有方法,
 *  1、定义方法的格式:String name();
 *  2、可以有默认值,也可以没有,如果没有默认值在使用的时候必须填写对应的值
 *      如果需要有默认值,使用default指定默认值。
 *  3、如果想在使用的时候不指定具体的名字,
 *
 *  如果不学习反射,注解没啥用!!!
 *
 *  在java的整个的注解体系中,有3个非常重要的主干类,
 *  1、Annotation 接口,定义一些常用的方法
 *  2、ElementType 枚举
 *      它用来指定注解的类型。说人话,我的注解要用在哪里???
 *  3、RetentionPolicy 枚举
 *      它用来指定注解的策略。不同类型的策略指定的注解的作用域不同。
 *     (1)SOURCE,注解仅存在于编译器处理期间,编译期处理完之后,这个注解就没用了
 *     (2)CLASS,注解在.class文件中依然有效。
 *     (3)RUNTIME,编译期是不起作用的,只有在运行期才由JVM读取。
 *
 *  Java自带的注解,10个。4个注解java.lang.annotation
 *                       6个注解在java.lang
 *
 *  作用在代码上的注解
 *  1、@Override,检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中没有该方法,会报错
 *  2、@Deprecated,标记的方法,过时的方法。
 *  3、@SuppressWarnings编辑器去忽略警告
 *
 *  4、@SafeVarargs,JDK7支持忽略任何使用参数为泛型变量的方法或构造器产生的警告
 *  5、@FunctionalInterface,JDK8开始支持,表示一个接口为函数式接口
 *  6、@Repeatable,JDK8开始支持,标识某个注解可以在同一个声明上使用多次
 *      all:忽略所有警告
 *      boxing:忽略装箱、拆箱警告
 *      rawtypes:使用生成时没有指定数据类型
 *      unchecked:忽略没有进行类型检查操作的警告
 *      unused:忽略没有使用的警告
 *  元注解:
 *  1、@Retention:标识这个注解作用域
 *  2、@Documented:标记这个注解是否包含在用户文档中
 *  3、@Target:这个注解可以修饰哪些信息
 *  4、@Inherited:如果一个类用上了@Inherited注解,那么其子类也会继承这个注解

映射

获取类对象的方法

Class<Dog> clazz =Dog.class;

Class aClass = Class.forName("com.jsoft.morning.Dog");

使用class类对象实例化一个对象的方法

   Dog dog = clazz.newInstance();

 clazz.getDeclaredConstructor().newInstance();

获取到成员变量的方法

 Field type = clazz.getField("type");

 Field[] fields = clazz.getFields();

获取到private属性

 Field name = clazz.getDeclaredField("name");

Field[] declaredFields = clazz.getDeclaredFields();

 // 获取哪一个对象的name
        String str = (String) name.get(对象名);

//更改一个对象的属性

name.set(dog,"拉布拉多");

//更改一个对象的私有属性

 // 暴力注入
        name.setAccessible(true);
        name.set(dog,"拉布拉多");

  public void show(String str) {
        System.out.println("show方法..." + str);
    }

//通过类对象获取方法

Method show = clazz.getMethod("show", String.class);

//获取所有方法

Method[] methods = clazz.getMethods();

 // 执行方法,使用反射调用方法
        show.invoke(对象名,"hello");

//获得私有方法

  Method fun = clazz.getDeclaredMethod("fun");

//执行私有方法

 fun.setAccessible(true);
        fun.invoke(dog);

//通过反射调用构造器

  Constructor<?>[] constructors = clazz.getConstructors();

  Constructor<Dog> declaredConstructor = clazz.getDeclaredConstructor();

//通过构造器创建对象

Dog dog = declaredConstructor.newInstance();

 private Dog(String name){
        this.name = name;
    }

//获取私有构造器,并创建对象

  Constructor<Dog> declaredConstructor1 = clazz.getDeclaredConstructor(String.class);
        declaredConstructor1.setAccessible(true);
        Dog dog1 = declaredConstructor1.newInstance("小强");


    @MyAnnotation(value = 20,age=10)
    public void show(String str) {
        System.out.println("show方法..." + str);
    }

//获取注解的返回值

Method show = clazz.getDeclaredMethod("show", String.class);
        MyAnnotation annotation1 = show.getAnnotation(MyAnnotation.class);
        System.out.println(annotation1.age());


File类是文件和目录路径名的抽象表示

文件和目录是可以通过File封装成对象的

 哈希表: 数组初始化容量是16,计算哈希值取余得到xiabiao,存储数据,如果下标相同(hash冲突),自动转成链表,如果链表长度超过8,则转成红黑树,如果红黑树节点小于6,自动转成链表,如果默认红黑树节点不够,会动态扩容(2n)

Map集合不能直接使用迭代器(map.iterator()),思路就是把双列集合转为单例集合,转成set就可以使用了


concurrentHashmap(分段锁):每一把锁只锁容器中其中一部分数据

concurrentHashmap是由Segment数组结构和hashEntry数组结构组成

synchronized修饰方法的情况:

ACC_SYNCHRONIZED标识:指明了该方法时一个同步方法,jvm通过该标志来辨别一个方法是否为同步方法 

ThreadLocal 是什么?有哪些使用场景?(高频)

ThreadLocal是一个线程工具类,可以在一个线程内共享数据,在我们的项目中使用ThreadLocal 存储的是解析token以后的用户数据。底层实现是同一个Map进行数据的存储,Map的键是当前线程对 象,值就是要共享的数据。

控制并发访问线程的数量

package demo1;

import org.junit.Test;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class Ch3 implements Runnable{

    private Semaphore semaphore=new Semaphore(2);
    @Override
    public void run() {
        try {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName()+"正在经过十字路口");
            TimeUnit.SECONDS.sleep(20);
            System.out.println(Thread.currentThread().getName()+"驶出十字路口");
            semaphore.release();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    @Test
    public void test1(){
        Ch3 ch3=new Ch3();
        for (int i = 0; i < 5; i++) {
            new Thread(ch3).start();
        }
    }
}

JMM( Java Memory Model) java内存模型

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值