0
点赞
收藏
分享

微信扫一扫

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我


By CaesarChang               

~关注我  带你看更多精品技术和面试必备

枚举:

权限修饰符

实例1,实例2,实例3,实例4;

}

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我_加载

主要方法:

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我_加载_02

 

枚举类实现接口 

 注意:

枚举类不能有子类,因为其枚举类默认被final修饰

不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。

 不能定义name属性,因为自带name属性

只能有private构造方法

switch中使用枚举时,直接使用常量名,不用携带类名

注解:

也称作 java标注,Java 语言中的类、方法、变量、参数和包等都可以被标注。

和注释不同,Java 标注可以通过反射获取标 注内容

Java 虚拟机可以保留标注内容,在运行 时可以获取到标注内容 。

----------------------------------------------------------------------------------

 @Override : 重写 *

----------------------------------------------------------------------------------

@Deprecated:废弃 *

----------------------------------------------------------------------------------

@FunctionalInterface: 函数式接口 *

----------------------------------------------------------------------------------

@SuppressWarnings:抑制编译时的警告信息。 *

@SuppressWarnings("unchecked") [^ 抑制单类型的警告]

2. @SuppressWarnings("unchecked","rawtypes") [^ 抑制多类型的警告]

3. @SuppressWarnings("all") [^ 抑制所有类型的警告]

----------------------------------------------------------------------------------

 什么是元注解

可以注解到注解上的注解

元标签有五个:@Retention​@Documented​​@Target​​@Inherited​​@Repeatable​

1. ​​@Retention 存活时间​

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我_加载器_03

2. ​​@Documented 保存到javadoc​

将注解中的元素包含到 Javadoc 中去。

3. ​​@Target 限定使用场景​

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我_类加载器_04

​4 @Inherited 注解继承​​ 

如果父类被@Inherited注解,那么子类没有被任何注解应用的话,那么这个子类就继承了父类的注解。

​5 @Repeatable 重复​

@Person(role="artist")

@Person(role="coder")

@Person(role="PM")

public class SuperMan{}

@interface Persons {

Person[] value();   //@Repeatable  注解的 是数组

}

 自定义注解

格式:  public  @interface  自定义注解名  {

}

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我_类加载器_05

@interface 定义注解时,意味着它实现了 java.lang.annotation.Annotation 接口,即该注解就是 一个Annotation。

不能继承其他的注解或接口。

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我_加载器_06

都会有唯一的 RetentionPolicy 属性;至于 ElementType 属性,则有 1~n个

 ElementType(注解的用途类型)

参数

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我_加载器_07

 RetentionPolicy(注解作用域策略)

参数:

Java里面的 枚举.注解 反射 (最全 精美装) 不好你打我_类加载器_08

 反射:

JAVA反射机制是在运行状态中,获取任意一个类的结构 , 创建对象 , 得到方法,执行方法 , 属性 !

动态获取信息以及动态获取对象方法

 类加载器 :负责动态加载Java类到Java虚拟机的内存空间中。

默认有三种类加载器,BootstrapClassLoader、ExtensionClassLoader、App ClassLoader。

BootstrapClassLoader(引导启动类加载器): 嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,引 导启动类加载器无法被应用程序直接使用。

ExtensionClassLoader(扩展类加载器): ExtensionClassLoader是用JAVA编写,且它的父类加载器是Bootstrap。 是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类 库。 它的父加载器是BootstrapClassLoader

App ClassLoader(应用类加载器): App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文 件。它的父加载器为Ext ClassLoader

双亲委派模型如果一个类加载器收到了一个类加载请求,它不会自己去尝试加载这个类,而是把这个请求 转交给父类加载器去完成。每一个层次的类加载器都是如此。因此所有的类加载请求都应该传递到最顶层的 启动类加载器中,只有到父类加载器反馈自己无法完成这个加载请求(在它的搜索范围没有找到这个类) 时,子类加载器才会尝试自己去加载。委派的好处就是避免有些类被重复加载。

获取Constructor 

1 getConstructor(参数类型的class对象数组)

构造方法如下: Person(String name,int age)

Constructor c = p.getClass().getConstructor(String.class,int.class);

2 获取构造方法数组

getConstructors();

3. 获取所有权限的单个构造方法

getDeclaredConstructor(参数类型的class对象数组)

4. 获取所有权限的构造方法数组

getDeclaredConstructors();    同事使用setAccessible(true)

Constructor 创建对象

 newInstance(Object... para)      

获取Method 

1. getMethod(String methodName , class.. clss)

根据参数列表的类型和方法名, 得到一个方法(public修饰的)

2. getMethods();

得到一个类的所有方法 (public修饰的)

3. getDeclaredMethod(String methodName , class.. clss)

根据参数列表的类型和方法名, 得到一个方法(除继承以外所有的:包含私有, 共有, 保护, 默认)

4. getDeclaredMethods();

得到一个类的所有方法 (除继承以外所有的:包含私有, 共有, 保护, 默认)     同事使用setAccessible(true)

 Method 执行方法

invoke(Object o,Object... para) :

调用方法 ,

参数1. 要调用方法的对象

参数2. 要传递的参数列表

getName()

获取方法的方法名称

 获取Field

1、通过class对象 获取一个类的属性

1. getDeclaredField(String filedName)

根据属性的名称, 获取一个属性对象 (所有属性)

2. getDeclaredFields()          同事使用setAccessible(true)

获取所有属性

3. getField(String filedName)

根据属性的名称, 获取一个属性对象 (public属性)

4. getFields()

获取所有属性 (public)

Field 属性的对象类型 

1. get(Object o );

参数: 要获取属性的对象 获取指定对象的此属性值

2. set(Object o , Object value);

参数1. 要设置属性值的 对象

参数2. 要设置的值 设置指定对象的属性的值

3. getName()

获取属性的名称

获取全部注解对象

Annotation[] annotations01 = Class/Field/Method.getAnnotations();

for (Annotation annotation : annotations01) {

System.out.println(annotation);

}

获取注解对象

注解类型 对象名 = (注解类型) c.getAnnotation(注解类型.class); 

内省 

 应用到JavaBean的API

bean类?

 拥有无参构造器

所有属性私有,

所有属性提供get/set方法

实现了序列化接口

 Introspector   获取Bean类信息

BeanInfo getBeanInfo(Class cls)

通过传入的类信息, 得到这个Bean类的封装对象 .

BeanInfo    

MethodDescriptor[] getPropertyDescriptors():

获取bean类的 get/set方法 数组

MethodDescriptor 

1. Method getReadMethod();

获取一个get方法

2. Method getWriteMethod();

获取一个set方法 有可能返回null 注意 ,加判断 !

举报

相关推荐

0 条评论