一 、注解
1.一些内置注解
@Override,@Deprecated
2.元注解
元注解的作用就是负责注解其他注解
4个标准元注解(meta-annotation)
(1)@Target:描述注解的使用范围(类,方法…)
(2)@Retention:表示需要在什么级别保存改注释信息,用于描述注解的生命周期(SOURCE<CALSS<RUNTIME)
(3)@Document:说明该注解将被包含在javadoc中
(4)@Inherited:说明字类可以继承父类中的该注解
3.自定义注解
使用@interface自定义注解
(1)注解的参数定义参数类型+参数名+(),default表示默认
(PS 如果int类型的默认值为-1,则默认不存在)
@interface testannotation
{
//注解的参数
String name() default "";`
@testannotation(name = "张大炮")
public void testannotation()
{
}
二、反射
首先了解一下静态和动态语言
反射的优缺点:
反射可以实现动态创建对象和编译,灵活
对性能有影响。使用反射本质上是一种解释操作,我们可以告诉jvm要做什么,这类操作总是慢于直接执行相同的操作
1.Class类
Class类是java反射的源头
Jre为每一个类都保留一个不变的Class类型的对象,当类Load时候,类的class文件读入内存,并为之创建一个Class对象
关于Class类
获取Class类的实例方法:
a)已知具体的类,通过类获得
Class a = Person.class;
b)已知某个类的实例
Class b = person.getClass();
c)已知全类名
Class c = Class.forName(全类名)
d)基本内置类型的包装类都有一个Type属性
Class d = Integer.TYPE;
2.通过反射动态创建对象
Class c1 = Class.forName("com.user")
User user = (user) c1.newInstance();//调用无参构造器
通过构造器构造
Constructor con = c1.getDeclaredConstructor(参数类.class。。)
User user2 = (user) con.newInstance(参数);
3.通过反射获得一个方法
Method setName = con.getDeclaredMethod(“方法名”,参数类.class…)
setName.invoke(对象,参数)//执行
4.通过反射操作属性
User user4 =(user) c1.newInstance();
Field name = c1.getDeclaredField("name");
//不能直接操作私有属性
name.setAccessible(true);//设置访问权限
name.set(user4,"大炮");
5.通过反射获取泛型信息
重要!6.通过反射获取注解
(a)获得类的注解
Class aClass = Class.forName("reflection.student");
Annotation[] annotations = aClass.getAnnotations();
for (Annotation a :
annotations) {
System.out.println(a);
}
Tablestu annotation = (Tablestu)aClass.getAnnotation(Tablestu.class);
System.out.println(annotation.value());
(b)获得属性的注解
Field name = aClass.getDeclaredField("name");
Fieldstu f = name.getAnnotation(Fieldstu.class);
System.out.println(f);