Java-10注解与反射
注解
-
注解(Annotation)也被称为元数据(Metadata),用于修饰包、方法、属性、构造器、局部变量等数据信息。
-
注解不影响程序逻辑,但注解可以被编译或运行。
-
在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
常用注解
-
@Override: 限定某个函数必须重写其他函数,该注解只能用于函数。函数名和参数列表必须相同。
是参数列表和返回类型要完全与被重写的方法相同,发生在父子类中。 -
@Overload: 限定某个函数必须重载其他函数,该注解只能用于函数。函数名必须相同,参数列表必须不同。
是必须有不同的参数列表,可以有不同的返回类型,发生在一个类里面。 -
@Deprecated:用于表示某个程序元素(类、函数)已过时
-
@SuppressWarnings:抑制编译器警告
元注解
修饰其他注解的注解,就被称为元注解。
-
Retention:指定注解的作用范围
-
Target:指定注解可以用在哪些地方
-
Document:注定注解是否出出现在javadoc中
-
Inherited:子类会继承父类的注解
反射
- 反射:动态引入类、动态调用实例的成员函数、成员变量等。
常用API
-
java.lang.Class
-
java.lang.reflect.Method
-
java.lang.reflect.Field
-
java.lang.reflect.Constructor
package org.yxc;
public class Calculator {
public String name;
public Calculator() {}
public Calculator(String name) {
this.name = name;
}
public int add(int a, int b) {
return a + b;
}
}
package org.yxc;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class<?> cls = Class.forName("org.yxc.Calculator");
Object o = cls.newInstance();
Method method = cls.getMethod("add", int.class, int.class);
int res = (int)method.invoke(o, 3, 4);
System.out.println(res);
Field field = cls.getField("name");
field.set(o, "My Calculator!");
System.out.println(field.get(o));
Constructor<?> constructor = cls.getConstructor(String.class);
Object new_o = constructor.newInstance("New Calculator!");
System.out.println(new_o);
}
}
优缺点
-
优点:可以动态创建和使用对象,使用灵活
-
缺点:执行速度慢