@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }@Documented @Retention(RetentionPolicy.RUNTIME) @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) public @interface Deprecated { } The string {@code "unchecked"} is used to suppress
元注解的作用就是负责其他注解,java定义了4个标准的meta-annotation类型,他们被用来提供其他annotation类型座说明。

@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();
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {/*** Returns the retention policy.* @return the retention policy*/RetentionPolicy value();
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

示例:
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();
}





示例:
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;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", id=" + id +", address='" + address + '\'' +'}';}}
运行结果:





示例:
//测试一下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 = "人";}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}class Student extends Person{public Student(){this.name="学生";}
}class Teacher extends Person{public Teacher(){this.name="老师";}
}
运行结果:


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;//ClassSystem.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());}
}
运行结果如下:




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、初始化:* (){* 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类的无参构造初始化");}
}
运行结果:


//测试类何时被加载
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);


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* */}
}
运行结果:


示例:
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

//动态创建对象,通过反射
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());}
}
运行结果:

总结:



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();}
}

下一篇:我省全面完成年度生态环境保护任务