【总结】反射
一.注解
1.注解概述
Java 注解是 JDK5.0 引入的一种注释机制,注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中
2.内置注解
作用在代码的注解
(1)@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
(2)@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
(3)@SuppressWarnings - 指示编译器去忽略注解中声明的警告
3.元注解
作用在其它注解的注解
(1)@Retention - 需要在什么级别保存该注释信息(source<class<runtime )
(2)@Documented - 标记这些注解是否包含在用户文档中
(3)@Target - 描述注解的适用范围(作用在方法上,还是类上,还是什么上)
(4)@Inherited - 子类可以继承父类的注解
4.自定义注解
使用@interface自定义注解
@Info(isDelete = true)
public class Person {
private String name;
private int age;
private boolean isDelete;
}
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Info {
String value() default "tracy";
boolean isDelete();
}
5.读取注解
通过反射
二. 反射
1.静态语言和动态语言
1.动态语言
运行时可以根据某些条件改变自身结构
c#,php,python
//本来x是字符串,通过eval可以把字符串当代码执行
function f(){
var x = "var a=3; alert(a)";
eval(x);
}
2.静态语言
运行时结构不可变的语言
c,c++,java
(java不是动态语言,但可以称为准动态语言。可以利用反射机制获取类似动态语言的特性)
2.反射概述
通过reflection api获得类的内部信息,并能操作任意对象的属性和方法
3.反射优点和缺点
(1)优点:可以实现动态的创建对象和编译,体现了很大的灵活性
(2)缺点:对性能有影响。反射是一种解释操作(和new创建对象相差几十倍)
4.获得Class类的方式
1.Class clazz = 类名.class;
2.Class clazz = 对象.getClass();
3.Class clazz = Class.forName("全限定名");
5.哪些类型有class对象
类,接口, 数组,枚举,注解,基本数据类型,void
6.获取类的运行时结构
Class c1 = 类名.class;
//获得类名
c1.getName();//获得包名+类名
c1.getSimpleName();//获得类名
//获得属性
c1.getFields();//获得所有public属性
c1.getDeclaredDFields();//获得全部属性
c1.getField("name");//获得指定属性(public)
c1.getDeclaredDField("name");
//获得方法
c1.getMethords();//获得本类和父类的全部public方法
c1.getDeclaredDMethods();//获取本类的所有方法
//获取注解
c1.getAnnotations()
注解 zhu = c1.getAnnotation(注解名.class)
zhu.getValue();//获得注解中的值
//获得构造器
c1.getCrontructors();
c1.getConstructor(String.class);//获得指定构造器
//构造对象
c1.newInstrance();//默认调用无参构造器
//构造有参对象
Constructor constructor = c1.getConstructor(String.class);
constructor.newInstance("kaka");
//执行方法
Method method = c1.getDeclaredDMethod("setName", String.class);
method.invoke(user1, "kaka")
//获取泛型
(1)Class<?> type = field.getType();//获得字段的类型
(2)ParameterizedType pt = (ParameterizedType)t;//强转到其子类( Type这个类里面没有任何的方法,所以需要调用子类的方法)
(3) Type t = f.getGenericType();//包含泛型的类型

浙公网安备 33010602011771号