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