JAVA-注解和反射

1、什么是注解?

  • Annotation是从JDK5.0开始引入的新技术
  • Annotation的作用:
    不是程序本身,可以对程序作出解释(这一点和注释(comment)类似)
    可以被其他程序(比如:编译器等)读取
  • Annotation的格式:
    注解是以“@注释名”在代码中存在的,还可以添加一些参数值,列如:@SuppressWarnings(value=“unchecked”).
  • Annotation在哪里使用?
    可以附加在package,class,method,field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。

2、内置注解:

  • @Override:
    定义在java.lang.OverRide中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
  • @Deprecated:
    定义在java.lang.Deprecated中,此注释可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择。@Documented @Retention(RetentionPolicy.RUNTIME) @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) public @interface Deprecated { }
  • @SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。与前两个注解有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的。
    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SuppressWarnings {
    /**
    • The set of warnings that are to be suppressed by the compiler in the
    • annotated element. Duplicate names are permitted. The second and
    • successive occurrences of a name are ignored. The presence of
    • unrecognized warning names is not an error: Compilers must
    • ignore any warning names they do not recognize. They are, however,
    • free to emit a warning if an annotation contains an unrecognized
    • warning name.
    • The string {@code "unchecked"} is used to suppress

    • unchecked warnings. Compiler vendors should document the
    • additional warning names they support in conjunction with this
    • annotation type. They are encouraged to cooperate to ensure
    • that the same names work across multiple compilers.
    • @return the set of warnings to be suppressed
      */
      String[] value();
      }
      `

3、元注解:

元注解的作用就是负责其他注解,java定义了4个标准的meta-annotation类型,他们被用来提供其他annotation类型座说明。
在这里插入图片描述

  • @Target:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}
  • @Retention:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
  • @Documented:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

  • @Inherited:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

4、自定义注解:

在这里插入图片描述
示例:

import java.lang.annotation.*;

//自定义注解
public class Test03 {
    //注解参数的值,可以有默认的,也可自定义
    //如果没有默认值,我们就必须赋值
    @MyAnnotation(name = "一个人的时候更要努力哦!",schools = "塔大")
    public void test03(){

    }
    @MyAnnotation2("抬头看看远方吧!")
    public void test04(){

    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
@interface MyAnnotation{

    //注解的参数:参数类型+参数名称()
    String name() default  "";
    int id() default -1;//-1代表不存在
    String[] schools();
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
@interface MyAnnotation2{
    String value();
}

5、反射机制:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
示例:

public class Test04 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class c1=Class.forName("com.jpaexample.demo03.test.User");
        System.out.println(c1);
        System.out.println("------------------------------------");
        //以下输出的结果都是一样的,说明一个类在内存中只有一个Class对象
        //一个类加载后,整个类的结构都会被封装在Class对象中
        Class c2=Class.forName("com.jpaexample.demo03.test.User");
        Class c3=Class.forName("com.jpaexample.demo03.test.User");
        Class c4=Class.forName("com.jpaexample.demo03.test.User");
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());
        System.out.println(c4.hashCode());
    }
}

 class User{
    String name;
    int id;
    String address;

     public String getName() {
         return name;
     }

     public void setName(String name) {
         this.name = name;
     }

     public int getId() {
         return id;
     }

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

     public String getAddress() {
         return address;
     }

     public void setAddress(String address) {
         this.address = address;
     }

     public User() {
     }

     public User(String name, int id, String address) {
         this.name = name;
         this.id = id;
         this.address = address;
     }

     @Override
     public String toString() {
         return "User{" +
                 "name='" + name + '\'' +
                 ", id=" + id +
                 ", address='" + address + '\'' +
                 '}';
     }
 }

运行结果:
在这里插入图片描述

  • Class类:

在这里插入图片描述
在这里插入图片描述

  • Class类的常用方法:

在这里插入图片描述

  • 获取Class类的实例:

在这里插入图片描述
示例:

//测试一下Class类的创建方式有哪些
public class Test05 {
    public static void main(String[] args) throws ClassNotFoundException {
       Person person=new Student();
        System.out.println("这个人是"+person.name);
        //1、通过对象获得
        Class c1=person.getClass();
        System.out.println(c1.hashCode());
        //2、通过Class.forName()获得
        Class c2=Class.forName("com.jpaexample.demo03.test.Student");
        System.out.println(c2.hashCode());
        //3、通过 类名.class获得
        Class c3 = Student.class;
        System.out.println(c3.hashCode());
        //4、基本内置类型的包装类都有一个Type属性
        Class c4 = Integer.TYPE;
        System.out.println(c4.hashCode());
        //5、获得父类类型
        Class c5=c1.getSuperclass();
        System.out.println(c5);
    }
}
class Person{
    public String name;

    public Person() {
    }

    public Person(String name) {
        this.name = "人";
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

class Student extends Person{
    public Student(){
        this.name="学生";
    }
}

class Teacher extends Person{
    public Teacher(){
        this.name="老师";
    }
}

运行结果:
在这里插入图片描述

  • 哪些类型可以有Class对象?
    在这里插入图片描述
    示例:
import java.lang.annotation.ElementType;

//所有类型的Class
public class Test06{
    public static void main(String[] args) {
        Class c1=Object.class;//类
        Class c2=Comparable.class;//接口
        Class c3=String[].class;//一维数组
        Class c4=int[][].class;//二维数组
        Class c5=Override.class;//注解
        Class c6= ElementType.class;//枚举
        Class c7=Integer.class;//基本数据类型
        Class c8=void.class;//Class

        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
        System.out.println(c6);
        System.out.println(c7);
        System.out.println(c8);

        int[] a=new int[10];
        int[] b=new int[100];
        System.out.println(a.getClass().hashCode());
        System.out.println(b.getClass().hashCode());
    }
}

运行结果如下:
在这里插入图片描述

6、类加载内存分析:

在这里插入图片描述

  • 类的加载过程:
    在这里插入图片描述
  • 类的加载与ClassLoader的理解:
    在这里插入图片描述
    示例:
public class Test07 {
    public static void main(String[] args) {
        A a=new A();
        System.out.println(A.m);
    }
}

class A{

   /*
   * 1、加载到内存,会产生一个类对应的Class对象
   * 2、链接,链接结束后m=0;
   * 3、初始化:
   * <clinit>(){
   *    System.out.println("A类的静态代码块初始化!");
   *     m=300;
   * }
   * */
    static{
        System.out.println("A类的静态代码块初始化!");
        m=300;
        m=100;
    }

    static int m=100;

    public A(){
        System.out.println("A类的无参构造初始化");
    }
}

运行结果:
在这里插入图片描述

  • 什么时候会发生类初始化?
    在这里插入图片描述
    示例:
    1、new一个类的对象:
//测试类何时被加载
public class Test08 {
    public static void main(String[] args) {
        //1、类的主动引用(一定会发生初始化)
        Son son=new Son();
    }

}
class Father{
    static{
        System.out.println("Father类的静态代码块被加载!");
        fn=10000;
    }
    public Father(){
        System.out.println("Father类的无参构造方法!");
    }
    static int fn=10;
}

class Son extends Father{

    static {
        System.out.println("Son类的静态代码块被加载!");
        n=10000;
    }
    static int n=10;
    static final int M=10;
    public Son(){
        System.out.println("Son类的无参构造方法!");
    }
}

运行结果:
在这里插入图片描述
可以看到当初始化一个类的时候,如果父类没有被初始化就会先去初始化其父类
2、反射也会产生主动引用:

//测试类何时被加载
public class Test08 {
    static {
        System.out.println("Main类被加载!");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        //反射也会产生主动引用
        Class.forName("com.jpaexample.demo03.test.Son");

    }

}
class Father{
    static{
        System.out.println("Father类的静态代码块被加载!");
        fn=10000;
    }
    public Father(){
        System.out.println("Father类的无参构造方法!");
    }
    static int fn=10;
}

class Son extends Father{

    static {
        System.out.println("Son类的静态代码块被加载!");
        n=10000;
    }
    static int n=10;
    static final int M=10;
    public Son(){
        System.out.println("Son类的无参构造方法!");
    }
}

运行结果:
在这里插入图片描述
3、不会产生类的引用示例:

//测试类何时被加载
public class Test08 {
    static {
        System.out.println("Main类被加载!");
    }
    public static void main(String[] args) throws ClassNotFoundException {
       //不会产生类的引用
        System.out.println(Son.fn);
    }

}
class Father{
    static{
        System.out.println("Father类的静态代码块被加载!");
        fn=10000;
    }
    public Father(){
        System.out.println("Father类的无参构造方法!");
    }
    static int fn=10;
}

class Son extends Father{

    static {
        System.out.println("Son类的静态代码块被加载!");
        n=10000;
    }
    static int n=10;
    static final int M=10;
    public Son(){
        System.out.println("Son类的无参构造方法!");
    }
}

在这里插入图片描述
可以看到,当通过子类引用父类的变量时。并不会导致子类的初始化。
一下两种方式也不会导致类被初始化:
Son[] array=new Son[10]; System.out.println(Son.M);

7、类加载器:

  • 类加载器的作用:
    在这里插入图片描述
    在这里插入图片描述
    示例:
public class Test07 {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取系统类的加载器
        ClassLoader systemClassLoader=ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);
        //获得系统类加载器的父类加载器-->扩展类加载器
        ClassLoader parent=systemClassLoader.getParent();
        System.out.println(parent);
        //获取扩展类记载器的父类加载器-->根加载器(c/c++)
        ClassLoader parent1=parent.getParent();
        System.out.println(parent1);
        //测试当前类是哪个类加载器加载的
        ClassLoader classLoader=Class.forName("com.example.jpademo.test.Test07").getClassLoader();
        System.out.println(classLoader);
        //测试java自定义的类是哪个类加载器加载的
        classLoader=Class.forName("java.lang.Object").getClassLoader();
        System.out.println(classLoader);
        //如何获得系统类加载器的加载路径
        System.out.println(System.getProperty("java.class.path"));
        /*类加载路径的结果:
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\charsets.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\deploy.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\dnsns.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\jaccess.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\localedata.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\nashorn.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\sunec.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\zipfs.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\javaws.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\jce.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\jfr.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\jfxswt.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\jsse.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\management-agent.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\plugin.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\resources.jar;
        * C:\Program Files\Java\jdk1.8.0_231\jre\lib\rt.jar;
        * D:\jpademo\target\classes;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.4.0\spring-boot-starter-data-jpa-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.4.0\spring-boot-starter-aop-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-aop\5.3.1\spring-aop-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.4.0\spring-boot-starter-jdbc-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\com\zaxxer\HikariCP\3.4.5\HikariCP-3.4.5.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-jdbc\5.3.1\spring-jdbc-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3.jar;
        * C:\Users\YYB\.m2\repository\jakarta\persistence\jakarta.persistence-api\2.2.3\jakarta.persistence-api-2.2.3.jar;
        * C:\Users\YYB\.m2\repository\org\hibernate\hibernate-core\5.4.23.Final\hibernate-core-5.4.23.Final.jar;
        * C:\Users\YYB\.m2\repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;
        * C:\Users\YYB\.m2\repository\org\javassist\javassist\3.24.0-GA\javassist-3.24.0-GA.jar;
        * C:\Users\YYB\.m2\repository\net\bytebuddy\byte-buddy\1.10.18\byte-buddy-1.10.18.jar;
        * C:\Users\YYB\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;
        * C:\Users\YYB\.m2\repository\org\jboss\jandex\2.1.3.Final\jandex-2.1.3.Final.jar;
        * C:\Users\YYB\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;
        * C:\Users\YYB\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;
        * C:\Users\YYB\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.1.2.Final\hibernate-commons-annotations-5.1.2.Final.jar;
        * C:\Users\YYB\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.3\jaxb-runtime-2.3.3.jar;
        * C:\Users\YYB\.m2\repository\org\glassfish\jaxb\txw2\2.3.3\txw2-2.3.3.jar;
        * C:\Users\YYB\.m2\repository\com\sun\istack\istack-commons-runtime\3.0.11\istack-commons-runtime-3.0.11.jar;
        * C:\Users\YYB\.m2\repository\com\sun\activation\jakarta.activation\1.2.2\jakarta.activation-1.2.2.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\data\spring-data-jpa\2.4.1\spring-data-jpa-2.4.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\data\spring-data-commons\2.4.1\spring-data-commons-2.4.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-orm\5.3.1\spring-orm-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-context\5.3.1\spring-context-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-tx\5.3.1\spring-tx-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-beans\5.3.1\spring-beans-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-aspects\5.3.1\spring-aspects-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.4.0\spring-boot-starter-web-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter\2.4.0\spring-boot-starter-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot\2.4.0\spring-boot-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.0\spring-boot-autoconfigure-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.4.0\spring-boot-starter-logging-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;
        * C:\Users\YYB\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;
        * C:\Users\YYB\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;
        * C:\Users\YYB\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;
        * C:\Users\YYB\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;
        * C:\Users\YYB\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;
        * C:\Users\YYB\.m2\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.4.0\spring-boot-starter-json-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;
        * C:\Users\YYB\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;
        * C:\Users\YYB\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;
        * C:\Users\YYB\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;
        * C:\Users\YYB\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;
        * C:\Users\YYB\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.0\spring-boot-starter-tomcat-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.39\tomcat-embed-core-9.0.39.jar;
        * C:\Users\YYB\.m2\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;
        * C:\Users\YYB\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.39\tomcat-embed-websocket-9.0.39.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-web\5.3.1\spring-web-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-webmvc\5.3.1\spring-webmvc-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-expression\5.3.1\spring-expression-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\mysql\mysql-connector-java\8.0.22\mysql-connector-java-8.0.22.jar;
        * C:\Users\YYB\.m2\repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;
        * C:\Users\YYB\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;
        * C:\Users\YYB\.m2\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-core\5.3.1\spring-core-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\spring-jcl\5.3.1\spring-jcl-5.3.1.jar;
        * C:\Users\YYB\.m2\repository\org\xmlunit\xmlunit-core\2.7.0\xmlunit-core-2.7.0.jar;
        * C:\Users\YYB\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;
        * C:\Users\YYB\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;
        * C:\Users\YYB\.m2\repository\org\mapstruct\mapstruct\1.3.0.Final\mapstruct-1.3.0.Final.jar;
        * C:\Users\YYB\.m2\repository\org\mapstruct\mapstruct-processor\1.3.1.Final\mapstruct-processor-1.3.1.Final.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-maven-plugin\2.4.0\spring-boot-maven-plugin-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-buildpack-platform\2.4.0\spring-boot-buildpack-platform-2.4.0.jar;
        * C:\Users\YYB\.m2\repository\net\java\dev\jna\jna-platform\5.5.0\jna-platform-5.5.0.jar;
        * C:\Users\YYB\.m2\repository\net\java\dev\jna\jna\5.5.0\jna-5.5.0.jar;C:\Users\YYB\.m2\repository\org\apache\commons\commons-compress\1.20\commons-compress-1.20.jar;C:\Users\YYB\.m2\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;C:\Users\YYB\.m2\repository\org\apache\httpcomponents\httpcore\4.4.13\httpcore-4.4.13.jar;C:\Users\YYB\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-loader-tools\2.4.0\spring-boot-loader-tools-2.4.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\shared\maven-common-artifact-filters\3.1.0\maven-common-artifact-filters-3.1.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-artifact\3.0\maven-artifact-3.0.jar;C:\Users\YYB\.m2\repository\org\sonatype\sisu\sisu-inject-plexus\1.4.2\sisu-inject-plexus-1.4.2.jar;C:\Users\YYB\.m2\repository\org\sonatype\sisu\sisu-inject-bean\1.4.2\sisu-inject-bean-1.4.2.jar;C:\Users\YYB\.m2\repository\org\sonatype\sisu\sisu-guice\2.1.7\sisu-guice-2.1.7-noaop.jar;C:\Users\YYB\.m2\repository\org\apache\maven\shared\maven-shared-utils\3.1.0\maven-shared-utils-3.1.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-plugin-api\3.6.3\maven-plugin-api-3.6.3.jar;C:\Users\YYB\.m2\repository\org\codehaus\plexus\plexus-utils\3.2.1\plexus-utils-3.2.1.jar;C:\Users\YYB\.m2\repository\org\codehaus\plexus\plexus-classworlds\2.6.0\plexus-classworlds-2.6.0.jar;C:\Users\YYB\.m2\repository\org\sonatype\plexus\plexus-build-api\0.0.7\plexus-build-api-0.0.7.jar;C:\Users\YYB\.m2\repository\org\apache\maven\plugins\maven-resources-plugin\3.2.0\maven-resources-plugin-3.2.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-core\3.1.0\maven-core-3.1.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-settings\3.1.0\maven-settings-3.1.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-settings-builder\3.1.0\maven-settings-builder-3.1.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-repository-metadata\3.1.0\maven-repository-metadata-3.1.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-model-builder\3.1.0\maven-model-builder-3.1.0.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-aether-provider\3.1.0\maven-aether-provider-3.1.0.jar;C:\Users\YYB\.m2\repository\org\eclipse\aether\aether-spi\0.9.0.M2\aether-spi-0.9.0.M2.jar;C:\Users\YYB\.m2\repository\org\eclipse\aether\aether-impl\0.9.0.M2\aether-impl-0.9.0.M2.jar;C:\Users\YYB\.m2\repository\org\eclipse\aether\aether-api\0.9.0.M2\aether-api-0.9.0.M2.jar;C:\Users\YYB\.m2\repository\org\eclipse\aether\aether-util\0.9.0.M2\aether-util-0.9.0.M2.jar;C:\Users\YYB\.m2\repository\org\sonatype\plexus\plexus-sec-dispatcher\1.3\plexus-sec-dispatcher-1.3.jar;C:\Users\YYB\.m2\repository\org\sonatype\plexus\plexus-cipher\1.4\plexus-cipher-1.4.jar;C:\Users\YYB\.m2\repository\org\apache\maven\maven-model\3.1.0\maven-model-3.1.0.jar;C:\Users\YYB\.m2\repository\org\codehaus\plexus\plexus-component-annotations\2.0.0\plexus-component-annotations-2.0.0.jar;C:\Users\YYB\.m2\repository\org\codehaus\plexus\plexus-interpolation\1.26\plexus-interpolation-1.26.jar;C:\Users\YYB\.m2\repository\org\eclipse\sisu\org.eclipse.sisu.plexus\0.0.0.M2a\org.eclipse.sisu.plexus-0.0.0.M2a.jar;C:\Users\YYB\.m2\repository\javax\enterprise\cdi-api\1.0\cdi-api-1.0.jar;C:\Users\YYB\.m2\repository\javax\annotation\jsr250-api\1.0\jsr250-api-1.0.jar;C:\Users\YYB\.m2\repository\javax\inject\javax.inject\1\javax.inject-1.jar;C:\Users\YYB\.m2\repository\com\google\guava\guava\10.0.1\guava-10.0.1.jar;C:\Users\YYB\.m2\repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;C:\Users\YYB\.m2\repository\org\sonatype\sisu\sisu-guice\3.1.0\sisu-guice-3.1.0-no_aop.jar;C:\Users\YYB\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\YYB\.m2\repository\org\eclipse\sisu\org.eclipse.sisu.inject\0.0.0.M2a\org.eclipse.sisu.inject-0.0.0.M2a.jar;C:\Users\YYB\.m2\repository\asm\asm\3.3.1\asm-3.3.1.jar;C:\Users\YYB\.m2\repository\org\apache\maven\shared\maven-filtering\3.2.0\maven-filtering-3.2.0.jar;C:\Users\YYB\.m2\repository\commons-io\commons-io\2.6\commons-io-2.6.jar;C:\Users\YYB\.m2\repository\org\apache\commons\commons-lang3\3.11\commons-lang3-3.11.jar;C:\Users\YYB\.m2\repository\net\bytebuddy\byte-buddy-dep\1.10.14\byte-buddy-dep-1.10.14.jar;C:\Users\YYB\.m2\repository\org\ow2\asm\asm\8.0.1\asm-8.0.1.jar;C:\Users\YYB\.m2\repository\org\ow2\asm\asm-commons\8.0.1\asm-commons-8.0.1.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar

         * */
    }
}

运行结果:
在这里插入图片描述

8、获取运行时类的完整结构

在这里插入图片描述
示例:

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

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        Class c1=Class.forName("com.startertest.starterone.YoungProperties");
        //获得类的名字
        System.out.println(c1.getName());//获得包名+类名
        System.out.println(c1.getSimpleName());//获得类名
        System.out.println("-------------------------通过反射的方式获得类的信息----------------");
        YoungProperties youngProperties=new YoungProperties();
        c1=youngProperties.getClass();
        System.out.println(c1.getName());
        System.out.println(c1.getSimpleName());
        System.out.println("-------------------------通过反射的方式获得类的属性----------------");
        Field[] fields=c1.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("-------------------------通过反射的方式获得类的指定属性的值----------------");
        Field name=c1.getDeclaredField("name");
        System.out.println(name);
        System.out.println("-------------------------通过反射的方式获得类的方法----------------");
        Method[] methods=c1.getMethods();//获得本类及其父类的所有public方法
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("-----------------------------------------------------------------");
        Method[] methods1=c1.getDeclaredMethods();//获得本类的所有方法
        for (Method method : methods1) {
            System.out.println(methods1);
        }
        System.out.println("----------------------------获得构造方法-------------------------------------");
        Constructor[] constructors=c1.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        System.out.println("---------------------------------c1.getDeclaredConstructors()-------------------------------------");
        Constructor[] constructors1=c1.getDeclaredConstructors();
        for (Constructor constructor : constructors1) {
            System.out.println(constructor);
        }
        System.out.println("---------------------------------获得指定的构造方法-------------------------------------");
        Constructor constructor=c1.getDeclaredConstructor(String.class,String.class,String.class,int.class);
        System.out.println(constructor);
    }
}

运行结果:

"C:\Program Files\Java\jdk1.8.0_231\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar=51626:C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_231\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\rt.jar;D:\starterone\target\classes;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.4.0\spring-boot-starter-data-jpa-2.4.0.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.4.0\spring-boot-starter-aop-2.4.0.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-aop\5.3.1\spring-aop-5.3.1.jar;C:\Users\YYB\.m2\repository\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.4.0\spring-boot-starter-jdbc-2.4.0.jar;C:\Users\YYB\.m2\repository\com\zaxxer\HikariCP\3.4.5\HikariCP-3.4.5.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-jdbc\5.3.1\spring-jdbc-5.3.1.jar;C:\Users\YYB\.m2\repository\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3.jar;C:\Users\YYB\.m2\repository\jakarta\persistence\jakarta.persistence-api\2.2.3\jakarta.persistence-api-2.2.3.jar;C:\Users\YYB\.m2\repository\org\hibernate\hibernate-core\5.4.23.Final\hibernate-core-5.4.23.Final.jar;C:\Users\YYB\.m2\repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;C:\Users\YYB\.m2\repository\org\javassist\javassist\3.24.0-GA\javassist-3.24.0-GA.jar;C:\Users\YYB\.m2\repository\net\bytebuddy\byte-buddy\1.10.18\byte-buddy-1.10.18.jar;C:\Users\YYB\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\YYB\.m2\repository\org\jboss\jandex\2.1.3.Final\jandex-2.1.3.Final.jar;C:\Users\YYB\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\YYB\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\YYB\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.1.2.Final\hibernate-commons-annotations-5.1.2.Final.jar;C:\Users\YYB\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.3\jaxb-runtime-2.3.3.jar;C:\Users\YYB\.m2\repository\org\glassfish\jaxb\txw2\2.3.3\txw2-2.3.3.jar;C:\Users\YYB\.m2\repository\com\sun\istack\istack-commons-runtime\3.0.11\istack-commons-runtime-3.0.11.jar;C:\Users\YYB\.m2\repository\com\sun\activation\jakarta.activation\1.2.2\jakarta.activation-1.2.2.jar;C:\Users\YYB\.m2\repository\org\springframework\data\spring-data-jpa\2.4.1\spring-data-jpa-2.4.1.jar;C:\Users\YYB\.m2\repository\org\springframework\data\spring-data-commons\2.4.1\spring-data-commons-2.4.1.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-orm\5.3.1\spring-orm-5.3.1.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-context\5.3.1\spring-context-5.3.1.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-tx\5.3.1\spring-tx-5.3.1.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-beans\5.3.1\spring-beans-5.3.1.jar;C:\Users\YYB\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-aspects\5.3.1\spring-aspects-5.3.1.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.4.0\spring-boot-starter-web-2.4.0.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter\2.4.0\spring-boot-starter-2.4.0.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot\2.4.0\spring-boot-2.4.0.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.0\spring-boot-autoconfigure-2.4.0.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.4.0\spring-boot-starter-logging-2.4.0.jar;C:\Users\YYB\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\YYB\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\YYB\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;C:\Users\YYB\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;C:\Users\YYB\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\YYB\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\YYB\.m2\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.4.0\spring-boot-starter-json-2.4.0.jar;C:\Users\YYB\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;C:\Users\YYB\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;C:\Users\YYB\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;C:\Users\YYB\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;C:\Users\YYB\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;C:\Users\YYB\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;C:\Users\YYB\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.0\spring-boot-starter-tomcat-2.4.0.jar;C:\Users\YYB\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.39\tomcat-embed-core-9.0.39.jar;C:\Users\YYB\.m2\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;C:\Users\YYB\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.39\tomcat-embed-websocket-9.0.39.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-web\5.3.1\spring-web-5.3.1.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-webmvc\5.3.1\spring-webmvc-5.3.1.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-expression\5.3.1\spring-expression-5.3.1.jar;C:\Users\YYB\.m2\repository\mysql\mysql-connector-java\8.0.22\mysql-connector-java-8.0.22.jar;C:\Users\YYB\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;C:\Users\YYB\.m2\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-core\5.3.1\spring-core-5.3.1.jar;C:\Users\YYB\.m2\repository\org\springframework\spring-jcl\5.3.1\spring-jcl-5.3.1.jar" com.startertest.starterone.Test
com.startertest.starterone.YoungProperties
YoungProperties
-------------------------通过反射的方式获得类的信息----------------
com.startertest.starterone.YoungProperties
YoungProperties
-------------------------通过反射的方式获得类的属性----------------
private java.lang.String com.startertest.starterone.YoungProperties.name
private java.lang.String com.startertest.starterone.YoungProperties.host
private java.lang.String com.startertest.starterone.YoungProperties.password
private int com.startertest.starterone.YoungProperties.port
-------------------------通过反射的方式获得类的指定属性的值----------------
private java.lang.String com.startertest.starterone.YoungProperties.name
-------------------------通过反射的方式获得类的方法----------------
public java.lang.String com.startertest.starterone.YoungProperties.toString()
public java.lang.String com.startertest.starterone.YoungProperties.getName()
public void com.startertest.starterone.YoungProperties.setName(java.lang.String)
public java.lang.String com.startertest.starterone.YoungProperties.getHost()
public int com.startertest.starterone.YoungProperties.getPort()
public java.lang.String com.startertest.starterone.YoungProperties.getPassword()
public void com.startertest.starterone.YoungProperties.setPort(int)
public void com.startertest.starterone.YoungProperties.setHost(java.lang.String)
public void com.startertest.starterone.YoungProperties.setPassword(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
-----------------------------------------------------------------
[Ljava.lang.reflect.Method;@7699a589
[Ljava.lang.reflect.Method;@7699a589
[Ljava.lang.reflect.Method;@7699a589
[Ljava.lang.reflect.Method;@7699a589
[Ljava.lang.reflect.Method;@7699a589
[Ljava.lang.reflect.Method;@7699a589
[Ljava.lang.reflect.Method;@7699a589
[Ljava.lang.reflect.Method;@7699a589
[Ljava.lang.reflect.Method;@7699a589
----------------------------获得构造方法-------------------------------------
public com.startertest.starterone.YoungProperties(java.lang.String,java.lang.String,java.lang.String,int)
public com.startertest.starterone.YoungProperties()
---------------------------------c1.getDeclaredConstructors()-------------------------------------
public com.startertest.starterone.YoungProperties(java.lang.String,java.lang.String,java.lang.String,int)
public com.startertest.starterone.YoungProperties()
---------------------------------获得指定的构造方法-------------------------------------
public com.startertest.starterone.YoungProperties(java.lang.String,java.lang.String,java.lang.String,int)

Process finished with exit code 0
  • 动态创建对象执行方法:
    有了Class对象能做什么?
    在这里插入图片描述
    示例:
//动态创建对象,通过反射
public class Test {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得Class对象
        Class c1=Class.forName("com.startertest.starterone.YoungProperties");
        //构造一个对象
       /* YoungProperties youngProperties=(YoungProperties) c1.newInstance();//本质是调用了无参的构造器
        System.out.println(youngProperties);*/
        //通过构造器创建对象
      /*  Constructor constructor=c1.getDeclaredConstructor(String.class,String.class,String.class,int.class);
        YoungProperties youngProperties2=(YoungProperties) constructor.newInstance("请","d","d",12);
        System.out.println(youngProperties2);*/

        //通过反射调用普通方法
        YoungProperties youngProperties=(YoungProperties) c1.newInstance();
        //通过反射获取一个方法
        Method setname=c1.getDeclaredMethod("setName", String.class);

        //invoke:激活的意思
        //(对象,”方法的值“)
        setname.invoke(youngProperties,"专注呀");
        System.out.println(youngProperties.getName());

        //通过反射操作属性
        System.out.println("----------------------------------------");
        YoungProperties youngProperties1=(YoungProperties) c1.newInstance();
        Field name=c1.getDeclaredField("name");

        //不能操作私有属性,我们需要关闭程序的安全检测,属性或者方法的setAccessible(true)
        name.setAccessible(true);
        name.set(youngProperties1,"专注再专注");
        System.out.println(youngProperties1.getName());

    }
}

运行结果:
在这里插入图片描述
总结:
在这里插入图片描述
在这里插入图片描述

  • 性能分析,setAccessible:
    在这里插入图片描述
    示例:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//分析性能问题
public class Test {

    //普通方式调用
    public static void test01(){
        YoungProperties youngProperties=new YoungProperties();
        long starTime=System.currentTimeMillis();
        for (int i=0;i<1000000000;i++){
            youngProperties.getName();
        }
        long endTime=System.currentTimeMillis();
        System.out.println("普通方式执行10亿次:"+(endTime-starTime)+"ms");
    }

    //反射方式调用
    public static void test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        YoungProperties youngProperties=new YoungProperties();
        Class c1=youngProperties.getClass();
        Method getName=c1.getDeclaredMethod("getName",null);
        long starTime=System.currentTimeMillis();
        for (int i=0;i<1000000000;i++){
            getName.invoke(youngProperties,null);
        }
        long endTime=System.currentTimeMillis();
        System.out.println("反射调用的方式执行10亿次:"+(endTime-starTime)+"ms");
    }
    //反射方式调用,关闭检测
    public static void test03() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        YoungProperties youngProperties=new YoungProperties();
        Class c1=youngProperties.getClass();
        Method getName=c1.getDeclaredMethod("getName",null);
        getName.setAccessible(true);
        long starTime=System.currentTimeMillis();
        for (int i=0;i<1000000000;i++){
            getName.invoke(youngProperties,null);
        }
        long endTime=System.currentTimeMillis();
        System.out.println("反射调用并关闭检测的方式执行10亿次:"+(endTime-starTime)+"ms");
    }
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
                test01();
                test02();
                test03();
    }
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值