编程新手用反射注解获取属性值

2 篇文章 0 订阅
1 篇文章 0 订阅

原创:believe_today

作为一个新手,很多时候都是压根不知道代码怎么写,没有总体思路,有时候又是写完一句,不知道下一局写什么了。下面我来讲一讲我作为一个新手的编程过程吧

首先要准备3个类一个注解

1. 做第一个类 Dogbean

 

package Test.net.study;

public class DogBean {
    private String name;
    private  String sex;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
2.第二个类  DogImpl

 

package Test.net.study;

public class DogImpl {
    @AutoWrite
    private DogBean dogBean;

    public DogBean getDogBean() {
        return this.dogBean;
    }
}
3.第三个,需要一个注解了

 

package Test.net.study;

import java.lang.annotation.*;
//注解需要表明清楚,整个编程才能运行,如果这里没有写明注解,那么你会运行出错(这是我最初遇到的问题)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface AutoWrite {
}
4.这也是最后的一个BOSS了,所有的代码都会集中在这里了,让我们来看看

 

package Test.net.study;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestCase {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //获取项目包的位置
        String pkgName = TestCase.class.getPackage().getName();
        String classPath = ".DogImpl";
        //通过包名加类名获取class(这里用到线程的知识了)
        Class clazz = Thread.currentThread().getContextClassLoader().loadClass(pkgName+classPath);
        //通过class创建一个对象
        Object object = clazz.newInstance();
        //遍历匿名类里的所有的字段并执行
        for (Field field : clazz.getDeclaredFields()){
            //判断字段是否为空
            if (field.getAnnotation(AutoWrite.class) !=null){
                //获取类中所有的字段方法
                Class fieldClass = field.getType();
                //创建一个对象
                Object fieldObject = fieldClass.newInstance();
                //遍历匿名类里的所有字段,并获取值
                for (Field field1 : fieldClass.getDeclaredFields()) {
                    //让第一个字母大写(这是一个获取字段首字母的句式,网上一搜就有了,不过还是要自己记住最好)
                    String fieldName = field1.getName();
                    fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                    fieldName = "set" + fieldName;
                    //这里开始赋值了
                    if(fieldName.equals("setName")){
                        //获取方法对象
                        Method method = fieldClass.getMethod(fieldName, String.class);
                        method.invoke(fieldObject, "格格");
                    }
                    else if(fieldName.equals("setSex")){
                        Method method = fieldClass.getMethod(fieldName, String.class);
                        method.invoke(fieldObject, "");
                    }

                }
                //取消private等声明的检查,强制放入
                field.setAccessible(true);
                //第一个变量是需要塞东西的对象,第二个变量是需要塞进去的东西
                field.set(object,fieldObject);
            }
        }
        //强制转换object对象
        DogImpl impl = (DogImpl) object;
        //打印输出
        System.out.println(impl.getDogBean().getName());
        System.out.println(impl.getDogBean().getSex());
    }
}
要以上4个代码都要OK没错了,那么运行结果就是这样的

 格格
 


Process finished with exit code 0


我这是第一次自己写博客,喜欢大家能够喜欢,多多关注我,我会努力每天都把自己每天所学到的,发到网上与大家一起学习讨论,有什么不好的地方欢迎大家能指出来。

最后,送大家一句话:

  越努力 ,越幸运

 美滋滋的说,哈哈~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值