通过反射获取字段,方法,注解

自定义一个注解

//自己写的注解@interface表示注解
 @Documented
 @Target(ElementType.METHOD)//添加在方法上的注解
 @Retention(RetentionPolicy.RUNTIME)//在运行的时候
public @interface Bwei {

     public String name() default "恩";
     public int age() default 22;
}
User类里面

public class User {
    public String name;
    private String age;

    public User(){

    }
    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }

    //注解加在方法上
    @Bwei(name ="恩恩",age = 23)
    public void sleep(){
        System.out.println("User sleep = ");
    }

    public void eat(String eat,int time){
        System.out.println("User eat ="+eat+""+time);
    }
    public void eat(String eat){
        System.out.println("User eat ="+eat);
    }

    public String toString(){
        return "User{" +
                "name='"+name+'\''+
                ",age="+age+'}';
    }


}
测试类里面的代码Test.java

/**
 * 反射注解
 * */
public class Test {
    //psvm
    public static void main(String[] args) {

        try {
            //获取到这个类
            Class clazz = Class.forName("com.example.menglucywhh.day1128_create.User");

          /*  //获取当前类的所有构造方法,public和private
            Constructor[] constructors = clazz.getDeclaredConstructors();
            for(Constructor constructor : constructors){
                System.out.println("constructor = "+constructor);
            }
            Constructor constructor = constructors[1];
            //设置允许访问
            constructor.setAccessible(true);
            User user = (User) constructor.newInstance("1509D","11");

            System.out.println("user = "+user.toString());*/


      /*   //通过参数的class获取指定的构造方法
            Constructor constructor = clazz.getConstructor(String.class,String.class);
            //创建一个对象
            User user = (User) constructor.newInstance("whw","20");

            System.out.println(constructor);

            System.out.println("user = "+user.toString());*/


           // Field[] fields = clazz.getFields();

         /*   User user = (User) clazz.newInstance();

            //获取当前类的所有属性

            Field[] fields = clazz.getDeclaredFields();

            for (Field field:fields){
                //设置可以访问private的属性
                field.setAccessible(true);
                System.out.println("field ="+field);
                //设置user对象属性值为11,name和age都为11
                field.set(user,"11");
                //获取user对象的属性值
                Object o = field.get(user);
                System.out.println("o = "+o);
            }

            System.out.println("user = "+user.toString());*/


        /*  //获取所有的方法 公有和私有
           Method[] methods =  clazz.getDeclaredMethods();
           //创建一个对象
            User user = (User) clazz.newInstance();
            for(Method method : methods){
                method.setAccessible(true);
                System.out.println("method = " + method);
            }

            Object toString =  methods[0].invoke(user,null);

             //调用的是eat 参数是1509D
          Object eat =   methods[1].invoke(user,"1509D");

            System.out.println("toString = " + eat);


            //name 方法名
           // String.class 参数的class 参数为string
            Method method =  clazz.getMethod("eat",String.class);
             //执行 user对象身上的方法 参数是1509
            method.invoke(user,"1509");*/


        //操作注解
            Method method = clazz.getMethod("sleep", null);

            //判断这个方法是否有这个注解
            boolean isEmpty = method.isAnnotationPresent(Bwei.class);
            if(isEmpty){
                //获取对应的注解
                Bwei bwei = method.getAnnotation(Bwei.class);
                System.out.println("bwei = "+bwei.name()+ "  "+bwei.age());
            }




        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值