注解和反射

注解和反射

1.注解

1.什么是注解

在这里插入图片描述

2.内置注解

在这里插入图片描述

3.元注解

1.元注解代码演示
package com.baidu.www;

import java.lang.annotation.*;

public class Test01 {
   @M
    public void show(){

}
}
//定义一个注解,表示注解的使用范围
@Target(value = {ElementType.METHOD})
//表示注解能在运行时间内使用
@Retention(value = RetentionPolicy.RUNTIME)
//是否生成文档
@Documented
//是否继承
@Inherited
@interface M {

}

4.自定义注解

在这里插入图片描述

1.自定注解代码演示
package com.baidu.www;



import java.lang.annotation.ElementType;

import java.lang.annotation.Target;

public class Test02 {
    @M1(name="易彪")
    public void t(){

    }
}

@Target(ElementType.METHOD)

@interface M1{
//注解定义参数 类型名+参数名();
String[] name() default "yx";
}

2.反射在这里插入图片描述

在这里插入图片描述

1.new对象内存分析

在这里插入图片描述

2.获取Class类实体

在这里插入图片描述

3.创建class类的三种方式

package com.baidu.www;
//测试class类创建的方式有哪些
public class Test04 {

    public static void main(String[] args) throws ClassNotFoundException {
        //通过对象获取
        Person person=new Person();
        Class c1 = person.getClass();
        //通过forname获取
        Class c2= Class.forName("com.baidu.www.Person");
        //通过类名直接获取
        Class c3=Person.class;
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());


    }
}
class Person{
    int id;

    public Person(){

    }
    public Person(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

class student extends Person{


}

4.所有类型的class

在这里插入图片描述

5.类的加载内存分析

在这里插入图片描述

1.画图分析

在这里插入图片描述

6.类的初始化

1.代码演示
package com.baidu.www;

public class Test05 {
    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println("主类的代码被加载");
        //主动引用
        //son s=new son();
        //反射也会导致主动引用
        // Class c=Class.forName("com.baidu.www.son");
        //System.out.println();
        //子类引用父类的静态变量不会导致子类初始化
        //System.out.println(son.F);
        //通过数组定义类不会导致初始化
        //son[] son=new son[4];
        //调用常量池的数不会导致初始化
        int i=son.S;
    }
}

class father {

    static int F = 1;

    static {
        System.out.println("父类的静态代码块");
    }

    static int F2 = 4;
}

class son extends father {

    static int S = 2;

    static {
        System.out.println("子类的静态代码块");
    }

    static final int S1 = 3;

}

7.类加载器

在这里插入图片描述

1.代码演示
package com.baidu.www;

import java.util.Properties;

public class Test06 {

    public void show(){

    }

    public static void main(String[] args) {

        //系统类加载器
       ClassLoader classLoader= ClassLoader.getSystemClassLoader();
        System.out.println(classLoader);
        //扩展类加载器
       ClassLoader parent= classLoader.getParent();
        System.out.println(parent);
        //根加载器
        ClassLoader s=parent.getParent();
        System.out.println(s);

        //如何获得系统类加载器的路径
        System.out.println( System.getProperty("java.class.path"));
    }
}


8.获取运行时的完整结构

代码演示

package com.baidu.www;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test07 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class c=Class.forName("com.baidu.www.User");
        //System.out.println(c.getName());
      //  System.out.println(c.getSimpleName());
        //System.out.println(c.getMethods());
       Field[] fields= c.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        //获取类以及其父类的所有public方法
       /* Method[] methods=c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }*/

        Method[] methods=c.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

    }
}

9.通过反射来创建对象并调用方法,属性

package com.baidu.www;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test08 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class c=Class.forName("com.baidu.www.User");
        //通过反射构造对象(无参构造)
        /*User user= (User)c.newInstance();
        System.out.println(user);*/
        /*Constructor constructor=  c.getDeclaredConstructor(String.class,int.class);
        User user= (User) constructor.newInstance("yx",1);
        System.out.println(user);*/
        //有参构造
      /*  Constructor constructor= c.getDeclaredConstructor(String.class,int.class);
        System.out.println(constructor.newInstance("YX", 2));*/

        //通过反射调用方法
     /*   User user2=(User)c.newInstance();
        Method method=c.getDeclaredMethod("setId", int.class);
        method.invoke(user2,1);
        System.out.println(user2);*/
        //通过反射获得属性
        User user3=(User)c.newInstance();
        Field field=c.getDeclaredField("name");
        field.set(user3,"yx");
        System.out.println(user3);
    }
}

10.获取泛型信息

11.获取注解信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值