【Java语法基础】10.注解与反射

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;
    }
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指针常量

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值