10.注解与反射
注解
注解也被称为元数据,用于修饰包、方法、属性等。
它不影响程序逻辑,但可以被编译或运行。
常用注解
-
@Override
:限定某个函数必须重写其他函数,该注解只能用于函数,函数名和参数列表必须相同 -
@Overload
:限定某个函数必须重载其他函数,该注解只能用于函数,函数名必须相同、参数列表必须不同 -
@Deprecated
:用于表示某个程序元素(类、函数、变量等)已过时 -
@SuppressWarnings
:抑制编译器警告
示例:
@SuppressWarnings({"all"})
class test
{
//如果从未使用过test可能会出现警告,采用上面的注释可以抑制警告
public int x = 2;
}
class Worker extends Thread
{
//重载Thread类的run函数
@Override
public void run(){}
}
元注解
修饰其他注解的注解,就被称为元注解。
Retention
:指定注解的作用范围Target
:指定注解可以用在哪些地方Document
:注定注解是否出出现在javadoc
中Inherited
:子类会继承父类的注解
反射
Java里的反射机制可用于:动态地加载类、动态地调用类实例的函数等。
以下是一个例子,从中我们可以看出动态加载类的一些API.
import java.lang.Class;
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.example.point.ColorPoint");
//获取类的实例,newInstance()调用的是无参构造函数
Object o = cls.newInstance();
//动态加载方法
Method method = cls.getMethod("add", int.class, int.class);
System.out.println(method.invoke(o, 3, 4));
Method get_string = cls.getMethod("getString");
System.out.println(get_string.invoke(o));
//获取成员变量
Field field = cls.getField("color");
//修改成员变量,注意该方法修改的变量必须是public
field.set(o, "changed");
System.out.println(field.get(o));
//调用有参构造函数动态加载类
Constructor<?> constructor = cls.getConstructor(int.class, int.class, String.class);
Object par_o = constructor.newInstance(1, 2, "Blue");
System.out.println(get_string.invoke(par_o));
}
}
//ColorPoint类的定义
public class ColorPoint extends Point
{
public String color;
public ColorPoint(int x, int y, String color)
{
//调用父类构造函数
super(x, y);
this.color = color;
}
//无参构造函数
public ColorPoint()
{
this.setX(999);
this.setY(999);
this.color = "default";
}
public void setColor(String color)
{
this.color = color;
}
public String getString()
{
return String.format(("(%d, %d, %s)"), super.getX(), super.getY(), color);
}
public int add(int x, int y)
{
return x + y;
}
}