题目如下:
定义一个可以用来接收用户登录信息的Annotation,其中用户名和密码要求通过Annotation设置到验证的方法中,如下所示:
@LoginInfo(name="用户名",password="密码") public boolean login(String name,String password){}
之后编写程序由键盘输入用户的登录信息,并通过login()方法判断输入的用户名和密码是否正确。
按照题目要求,我定义了一个Annotation,里面有name与password两个属性:
package annotationdemo01;
import java.lang.annotation.*;
@Target(ElementType.METHOD) //只对方法有效
@Retention(RetentionPolicy.RUNTIME) //运行时有效
public @interface LoginInfo { //定义注解
public String name() default "null";
public String password() default "null";
}
接着通过BufferedReader得到键盘输入信息,通过反射机制得到Annotation内容,并进行验证:
package annotationdemo01;
import java.io.*;
import java.lang.reflect.*;
class Validate {
private String name;
private String password;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public String getName() throws IOException { //获取账号
System.out.println("请输入账号:");
name = br.readLine();
return name;
}
public String getPassword() throws IOException { //获取密码
System.out.println("请输入密码:");
password = br.readLine();
return password;
}
@LoginInfo(name="myk",password="123456") //使用自定义注解
public boolean login(String name,String password) {
boolean flag = false;
Method m = null;
try{
//通过反射取得login方法
m = Validate.class.getMethod("login",String.class,String.class);
}catch(Exception e){
e.printStackTrace();
}
//取得自定义注解对象
LoginInfo li = m.getAnnotation(LoginInfo.class);
if (li.name().equals(name)&&li.password().equals(password))
{
flag = true;
}
return flag;
}
}
最后编写测试类:
package annotationdemo01;
import java.io.IOException;
public class Annotationdemo01 {
public static void main(String args[]) throws IOException {
String name;
String password;
Validate v=new Validate();
name=v.getName();
password=v.getPassword();
if(v.login(name,password)==true) {
System.out.println("账号密码正确");
}else System.out.println("账号或密码错误");
}
}
下面是输出结果:
注意在使用自定义Annotation时,设置的内容只能为常量表达式,不能为变量,所以无法动态使用。
以上代码使用JDK10,Eclipse编译器运行成功,如有错误或描述不当请多多指出。
觉得有用就点个赞呗~