编程语言
首页 > 编程语言> > Java注解和反射---初识注解反射

Java注解和反射---初识注解反射

作者:互联网

注解:

元注解:负责注解其他注解

主要的元注解为:

@Target:用于描述注解的使用范围(被描述的注解可以用在那个地方)

TYPE表示当前注解在类中有效,METHOD表示当前注解在方法中有效

@Retention:用于描述注解的生命周期(SOURCE<CLASS<RUNTION)

SOURCE:表示在源文件中当java文件被编译成class文件时就被遗弃了

CLASS:表示被保留在class文件,但jvm加载class文件就被遗弃了,这是默认的生命周期

RUNTION:表示运行时有效,该值的生命周期大于前两种

@Document:说明该注解将被包含在javadoc中

@Inherited:说明子类可以具有父类的注解

 

自定义注解:@interface自定义注解时,自动继承了java.lang.annontation.Annontation接口

自定义注解使用@interface自定义注解,尽量在自定义注解上加入两个元注解声明当前注解可以在哪里使用@Target和当前注解的生命周期@Retention

 

反射

什么是反射:反射是java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任何对象的内部属性及其方法

加载完类之后,在堆内存中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。一个类在内存中只有一个Class对象,这个对象就一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射

虽然反射很强大但它也是有缺点的,对象性能是有影响的使用反射基本上是一种解释操作,就是我们告诉虚拟机jvm,我们希望做什么并且它满足我们什么要求。这类操作总是慢于直接执行相同操作。说完了缺点我们在来看看他的优点,可以动态创建对象和编译,体现出很大的灵活性。

既然我们知道了反射是什么那我们就来看个demo体会一下反射吧

我们先创建一个类user

 

class user{
    private String name;
    private String age;
    private int id;

    public user() {
    }

    public user(String name, String age, int id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }
}

 

通过反射forName拿到他的Class对象

public class TestReflect {
    public static void main(String[] args) throws ClassNotFoundException {
        //通过反射获得类的Class对象
        Class forName = Class.forName("com.ssl.Test.user");
        System.out.println(forName);
    }
}

 那我们来看看运行的结果吧

 

光这个一个是不是还没有体现一个类在内存中只有一个Class对象这句话呢?

public class TestReflect {
public static void main(String[] args) throws ClassNotFoundException {
//通过反射获得类的Class对象
Class c1 = Class.forName("com.ssl.Test.user");
Class c2 = Class.forName("com.ssl.Test.user");
Class c3 = Class.forName("com.ssl.Test.user");
Class c4 = Class.forName("com.ssl.Test.user");

/**
* 这里我们用到了小学二年级学到的hashCode()方法体现是同一个Class对象
*/
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}
}

到这里我们是不是就理解了一个类在内存中只有一个Class对象这句话了呢?

其实获得Class对象的方式还有很多。。。。(下次再说吧)

  

 

 

 

 

标签:反射,forName,对象,---,user,注解,Class
来源: https://www.cnblogs.com/weitutou/p/13737136.html