反射基础----利用反射和注解做简单的工具

什么是反射

    是在运行状态中,必须先要获取一个类的字节码文件对象。就能解刨出它的所有属性和方法

反射常用类

  • Class类—可获取类和类的成员信息

   获取Class类对象的方式

    第一种方式

//对象.getClass

Student stu=new Student();
Class clazz=stu.getClass();

   第二种方式

//类.class
clazz= Student.class;
clazz=String.class;

   第三种方式

 //Class.forName()
clazz=Class.forName("java.lang.String");

反射的有点和缺点

  优点:

​ 1.提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力

​ 2.允许程序创建和控制任何类的对象,无需提前硬编码目标类

  缺点:

​ 1.性能问题

​ 2.代码维护问题

 

 

 public void Test(Object o) throws Exception {

        //获取类对象
        Class clazz = o.getClass();

        //获取构造方法
        Constructor[] constructors = clazz.getConstructors();

        //获取一个无参构造方法
        Constructor constructor = clazz.getConstructor();

        //获取带参构造方法
        Constructor constructor1 = clazz.getConstructor(String.class, int.class);

        //获取方法(获取所有的公开的方法,包括从父类继承过来的)
        Method[] method = clazz.getMethods();

        //获取类中所有的方法,包括私有的,不包括继承的方法
        Method[] declaredMethods = clazz.getDeclaredMethods();
        
    }

 

利用 注解 和 反射做一个简单的工具类

注解接口

@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Value {

    //注解的默认属性名,我们在使用注解的时候如果想直接写值,
    // 而不需要写name,那么代表当前注解中必须有一个value()的方法

//    String value();
}

 在定义属性的时候可以直接用注解给属性做标记

package com.zzh.utils;
/*
    //不懂说话,只可以对你笑
*/

public class User {
    @Value
    private String name;
    @Value
    private String userName;
    @Value
    private String password;

    @Value
    private String email;
    @Vvl("11")
    private long phone;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public long getPhone() {
        return phone;
    }

    public void setPhone(long phone) {
        this.phone = phone;
    }
}

 

工具类 判断

public class AnnotationUtil {

    public static void fillData(Object o)throws Exception{

        //获取类
        Class clazz = o.getClass();

        //获取类的所有声明的字段
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            //打开私有访问
            field.setAccessible(true);

            //判断变量上是否有注解
            Value annotation = field.getAnnotation(Value.class);

            //判断注解
            if(annotation != null){
                //获取属性值
                Object value = field.get(o);
                String val = (String) value;
                if(val == null || val.trim().equals("")){
                    //获取属性
                    field.getName();
                    System.out.println(field.getName()+"错误");
                    continue;
                }
                System.out.println(value);
            }
            Vvl In = field.getAnnotation(Vvl.class);
            if(In != null){
                //获取属性值
                Object value = field.get(o);
                Long vv = (Long)value;
                if(vv==null ||vv.toString().trim().equals("")){
                    System.out.println("手机号不能为空");
                    continue;
                }
                if(vv.toString().length()>11||vv.toString().length()<11){
                    System.out.println("手机号输入错误");
                    continue;
                }
                System.out.println(vv);
            }
        }
    }
}

 

后续.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值