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